diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) Henning Thielemann 2017
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the author nor the names of his contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#! /usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/blas-ffi.cabal b/blas-ffi.cabal
new file mode 100644
--- /dev/null
+++ b/blas-ffi.cabal
@@ -0,0 +1,50 @@
+Name:             blas-ffi
+Version:          0.0
+License:          BSD3
+License-File:     LICENSE
+Author:           Henning Thielemann <haskell@henning-thielemann.de>
+Maintainer:       Henning Thielemann <haskell@henning-thielemann.de>
+Homepage:         http://hub.darcs.net/thielema/blas-ffi/
+Category:         Math
+Synopsis:         Auto-generated interface to Fortran BLAS
+Description:
+  BLAS is a package for efficient basic linear algebra operations.
+  The reference implementation is written in FORTRAN.
+  .
+  This is an automatically generated low-level interface.
+  We provide bindings to functions of all variants
+  for @Float@, @Double@, @Complex Float@ and @Complex Double@.
+  We do not use TemplateHaskell nor HSC nor CHS,
+  but instead Haskell 98 code
+  generated by the custom @lapack-ffi-tools@ package.
+Tested-With:      GHC==7.4.2, GHC==7.8.4
+Cabal-Version:    >=1.14
+Build-Type:       Simple
+
+Source-Repository this
+  Tag:         0.0
+  Type:        darcs
+  Location:    http://hub.darcs.net/thielema/blas-ffi/
+
+Source-Repository head
+  Type:        darcs
+  Location:    http://hub.darcs.net/thielema/blas-ffi/
+
+Library
+  PkgConfig-Depends: blas
+  Build-Depends:
+    netlib-ffi >=0.0 && <0.1,
+    base >=4.5 && <5
+
+  GHC-Options:      -Wall
+  Hs-Source-Dirs:   src
+  Default-Language: Haskell98
+  Exposed-Modules:
+    Numeric.BLAS.FFI.Float
+    Numeric.BLAS.FFI.Double
+    Numeric.BLAS.FFI.Real
+    Numeric.BLAS.FFI.ComplexFloat
+    Numeric.BLAS.FFI.ComplexDouble
+    Numeric.BLAS.FFI.Complex
+    Numeric.BLAS.FFI.Generic
+    Numeric.BLAS.FFI.Miscellaneous
diff --git a/src/Numeric/BLAS/FFI/Complex.hs b/src/Numeric/BLAS/FFI/Complex.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/BLAS/FFI/Complex.hs
@@ -0,0 +1,272 @@
+-- Do not edit! Automatically generated by create-lapack-ffi.
+module Numeric.BLAS.FFI.Complex (
+   axpy,
+   cabs1,
+   casum,
+   cnrm2,
+   copy,
+   gbmv,
+   gemm,
+   gemv,
+   gerc,
+   geru,
+   hbmv,
+   hemm,
+   hemv,
+   her,
+   her2,
+   her2k,
+   herk,
+   hpmv,
+   hpr,
+   hpr2,
+   iamax,
+   rotg,
+   rrot,
+   rscal,
+   scal,
+   swap,
+   symm,
+   syr2k,
+   syrk,
+   tbmv,
+   tbsv,
+   tpmv,
+   tpsv,
+   trmm,
+   trmv,
+   trsm,
+   trsv,
+   ) where
+
+import qualified Numeric.BLAS.FFI.ComplexFloat as C
+import qualified Numeric.BLAS.FFI.ComplexDouble as Z
+
+import qualified Numeric.Netlib.Class as Class
+
+import Data.Complex (Complex)
+import Foreign.Ptr (Ptr)
+import Foreign.C.Types
+
+
+
+newtype AXPY a = AXPY {getAXPY :: Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+axpy :: Class.Real a => Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+axpy = getAXPY $ Class.switchReal (AXPY C.axpy) (AXPY Z.axpy)
+
+
+newtype CABS1 a = CABS1 {getCABS1 :: Ptr (Complex a) -> IO a}
+
+cabs1 :: Class.Real a => Ptr (Complex a) -> IO a
+cabs1 = getCABS1 $ Class.switchReal (CABS1 C.cabs1) (CABS1 Z.cabs1)
+
+
+newtype CASUM a = CASUM {getCASUM :: Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO a}
+
+casum :: Class.Real a => Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO a
+casum = getCASUM $ Class.switchReal (CASUM C.casum) (CASUM Z.casum)
+
+
+newtype CNRM2 a = CNRM2 {getCNRM2 :: Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO a}
+
+cnrm2 :: Class.Real a => Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO a
+cnrm2 = getCNRM2 $ Class.switchReal (CNRM2 C.cnrm2) (CNRM2 Z.cnrm2)
+
+
+newtype COPY a = COPY {getCOPY :: Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+copy :: Class.Real a => Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+copy = getCOPY $ Class.switchReal (COPY C.copy) (COPY Z.copy)
+
+
+newtype GBMV a = GBMV {getGBMV :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+gbmv :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+gbmv = getGBMV $ Class.switchReal (GBMV C.gbmv) (GBMV Z.gbmv)
+
+
+newtype GEMM a = GEMM {getGEMM :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+gemm :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+gemm = getGEMM $ Class.switchReal (GEMM C.gemm) (GEMM Z.gemm)
+
+
+newtype GEMV a = GEMV {getGEMV :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+gemv :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+gemv = getGEMV $ Class.switchReal (GEMV C.gemv) (GEMV Z.gemv)
+
+
+newtype GERC a = GERC {getGERC :: Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+gerc :: Class.Real a => Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+gerc = getGERC $ Class.switchReal (GERC C.gerc) (GERC Z.gerc)
+
+
+newtype GERU a = GERU {getGERU :: Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+geru :: Class.Real a => Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+geru = getGERU $ Class.switchReal (GERU C.geru) (GERU Z.geru)
+
+
+newtype HBMV a = HBMV {getHBMV :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+hbmv :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+hbmv = getHBMV $ Class.switchReal (HBMV C.hbmv) (HBMV Z.hbmv)
+
+
+newtype HEMM a = HEMM {getHEMM :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+hemm :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+hemm = getHEMM $ Class.switchReal (HEMM C.hemm) (HEMM Z.hemm)
+
+
+newtype HEMV a = HEMV {getHEMV :: Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+hemv :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+hemv = getHEMV $ Class.switchReal (HEMV C.hemv) (HEMV Z.hemv)
+
+
+newtype HER a = HER {getHER :: Ptr CChar -> Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+her :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+her = getHER $ Class.switchReal (HER C.her) (HER Z.her)
+
+
+newtype HER2 a = HER2 {getHER2 :: Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+her2 :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+her2 = getHER2 $ Class.switchReal (HER2 C.her2) (HER2 Z.her2)
+
+
+newtype HER2K a = HER2K {getHER2K :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+her2k :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> IO ()
+her2k = getHER2K $ Class.switchReal (HER2K C.her2k) (HER2K Z.her2k)
+
+
+newtype HERK a = HERK {getHERK :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+herk :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> IO ()
+herk = getHERK $ Class.switchReal (HERK C.herk) (HERK Z.herk)
+
+
+newtype HPMV a = HPMV {getHPMV :: Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+hpmv :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+hpmv = getHPMV $ Class.switchReal (HPMV C.hpmv) (HPMV Z.hpmv)
+
+
+newtype HPR a = HPR {getHPR :: Ptr CChar -> Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> IO ()}
+
+hpr :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> IO ()
+hpr = getHPR $ Class.switchReal (HPR C.hpr) (HPR Z.hpr)
+
+
+newtype HPR2 a = HPR2 {getHPR2 :: Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> IO ()}
+
+hpr2 :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> IO ()
+hpr2 = getHPR2 $ Class.switchReal (HPR2 C.hpr2) (HPR2 Z.hpr2)
+
+
+newtype IAMAX a = IAMAX {getIAMAX :: Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO CInt}
+
+iamax :: Class.Real a => Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO CInt
+iamax = getIAMAX $ Class.switchReal (IAMAX C.iamax) (IAMAX Z.iamax)
+
+
+newtype ROTG a = ROTG {getROTG :: Ptr (Complex a) -> Ptr (Complex a) -> Ptr a -> Ptr (Complex a) -> IO ()}
+
+rotg :: Class.Real a => Ptr (Complex a) -> Ptr (Complex a) -> Ptr a -> Ptr (Complex a) -> IO ()
+rotg = getROTG $ Class.switchReal (ROTG C.rotg) (ROTG Z.rotg)
+
+
+newtype RROT a = RROT {getRROT :: Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr a -> Ptr a -> IO ()}
+
+rrot :: Class.Real a => Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr a -> Ptr a -> IO ()
+rrot = getRROT $ Class.switchReal (RROT C.rrot) (RROT Z.rrot)
+
+
+newtype RSCAL a = RSCAL {getRSCAL :: Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+rscal :: Class.Real a => Ptr CInt -> Ptr a -> Ptr (Complex a) -> Ptr CInt -> IO ()
+rscal = getRSCAL $ Class.switchReal (RSCAL C.rscal) (RSCAL Z.rscal)
+
+
+newtype SCAL a = SCAL {getSCAL :: Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+scal :: Class.Real a => Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+scal = getSCAL $ Class.switchReal (SCAL C.scal) (SCAL Z.scal)
+
+
+newtype SWAP a = SWAP {getSWAP :: Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+swap :: Class.Real a => Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+swap = getSWAP $ Class.switchReal (SWAP C.swap) (SWAP Z.swap)
+
+
+newtype SYMM a = SYMM {getSYMM :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+symm :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+symm = getSYMM $ Class.switchReal (SYMM C.symm) (SYMM Z.symm)
+
+
+newtype SYR2K a = SYR2K {getSYR2K :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+syr2k :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+syr2k = getSYR2K $ Class.switchReal (SYR2K C.syr2k) (SYR2K Z.syr2k)
+
+
+newtype SYRK a = SYRK {getSYRK :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+syrk :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+syrk = getSYRK $ Class.switchReal (SYRK C.syrk) (SYRK Z.syrk)
+
+
+newtype TBMV a = TBMV {getTBMV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+tbmv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+tbmv = getTBMV $ Class.switchReal (TBMV C.tbmv) (TBMV Z.tbmv)
+
+
+newtype TBSV a = TBSV {getTBSV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+tbsv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+tbsv = getTBSV $ Class.switchReal (TBSV C.tbsv) (TBSV Z.tbsv)
+
+
+newtype TPMV a = TPMV {getTPMV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+tpmv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+tpmv = getTPMV $ Class.switchReal (TPMV C.tpmv) (TPMV Z.tpmv)
+
+
+newtype TPSV a = TPSV {getTPSV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+tpsv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> IO ()
+tpsv = getTPSV $ Class.switchReal (TPSV C.tpsv) (TPSV Z.tpsv)
+
+
+newtype TRMM a = TRMM {getTRMM :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+trmm :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+trmm = getTRMM $ Class.switchReal (TRMM C.trmm) (TRMM Z.trmm)
+
+
+newtype TRMV a = TRMV {getTRMV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+trmv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+trmv = getTRMV $ Class.switchReal (TRMV C.trmv) (TRMV Z.trmv)
+
+
+newtype TRSM a = TRSM {getTRSM :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+trsm :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex a) -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+trsm = getTRSM $ Class.switchReal (TRSM C.trsm) (TRSM Z.trsm)
+
+
+newtype TRSV a = TRSV {getTRSV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()}
+
+trsv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO ()
+trsv = getTRSV $ Class.switchReal (TRSV C.trsv) (TRSV Z.trsv)
diff --git a/src/Numeric/BLAS/FFI/ComplexDouble.hs b/src/Numeric/BLAS/FFI/ComplexDouble.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/BLAS/FFI/ComplexDouble.hs
@@ -0,0 +1,119 @@
+-- Do not edit! Automatically generated by create-lapack-ffi.
+{-# LANGUAGE ForeignFunctionInterface #-}
+module Numeric.BLAS.FFI.ComplexDouble where
+
+import Data.Complex (Complex)
+import Foreign.Ptr (Ptr)
+import Foreign.C.Types
+
+
+foreign import ccall "zaxpy_"
+   axpy :: Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "dcabs1_"
+   cabs1 :: Ptr (Complex Double) -> IO Double
+
+foreign import ccall "dzasum_"
+   casum :: Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO Double
+
+foreign import ccall "dznrm2_"
+   cnrm2 :: Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO Double
+
+foreign import ccall "zcopy_"
+   copy :: Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zgbmv_"
+   gbmv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zgemm_"
+   gemm :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zgemv_"
+   gemv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zgerc_"
+   gerc :: Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zgeru_"
+   geru :: Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zhbmv_"
+   hbmv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zhemm_"
+   hemm :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zhemv_"
+   hemv :: Ptr CChar -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zher_"
+   her :: Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zher2_"
+   her2 :: Ptr CChar -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zher2k_"
+   her2k :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr Double -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zherk_"
+   herk :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr (Complex Double) -> Ptr CInt -> Ptr Double -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zhpmv_"
+   hpmv :: Ptr CChar -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zhpr_"
+   hpr :: Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> IO ()
+
+foreign import ccall "zhpr2_"
+   hpr2 :: Ptr CChar -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> IO ()
+
+foreign import ccall "izamax_"
+   iamax :: Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO CInt
+
+foreign import ccall "zrotg_"
+   rotg :: Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr Double -> Ptr (Complex Double) -> IO ()
+
+foreign import ccall "zdrot_"
+   rrot :: Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr Double -> Ptr Double -> IO ()
+
+foreign import ccall "zdscal_"
+   rscal :: Ptr CInt -> Ptr Double -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zscal_"
+   scal :: Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zswap_"
+   swap :: Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zsymm_"
+   symm :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zsyr2k_"
+   syr2k :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "zsyrk_"
+   syrk :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "ztbmv_"
+   tbmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "ztbsv_"
+   tbsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "ztpmv_"
+   tpmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "ztpsv_"
+   tpsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "ztrmm_"
+   trmm :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "ztrmv_"
+   trmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "ztrsm_"
+   trsm :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Double) -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
+
+foreign import ccall "ztrsv_"
+   trsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO ()
diff --git a/src/Numeric/BLAS/FFI/ComplexFloat.hs b/src/Numeric/BLAS/FFI/ComplexFloat.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/BLAS/FFI/ComplexFloat.hs
@@ -0,0 +1,119 @@
+-- Do not edit! Automatically generated by create-lapack-ffi.
+{-# LANGUAGE ForeignFunctionInterface #-}
+module Numeric.BLAS.FFI.ComplexFloat where
+
+import Data.Complex (Complex)
+import Foreign.Ptr (Ptr)
+import Foreign.C.Types
+
+
+foreign import ccall "caxpy_"
+   axpy :: Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "scabs1_"
+   cabs1 :: Ptr (Complex Float) -> IO Float
+
+foreign import ccall "scasum_"
+   casum :: Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO Float
+
+foreign import ccall "scnrm2_"
+   cnrm2 :: Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO Float
+
+foreign import ccall "ccopy_"
+   copy :: Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cgbmv_"
+   gbmv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cgemm_"
+   gemm :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cgemv_"
+   gemv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cgerc_"
+   gerc :: Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cgeru_"
+   geru :: Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "chbmv_"
+   hbmv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "chemm_"
+   hemm :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "chemv_"
+   hemv :: Ptr CChar -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cher_"
+   her :: Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cher2_"
+   her2 :: Ptr CChar -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cher2k_"
+   her2k :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr Float -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cherk_"
+   herk :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr (Complex Float) -> Ptr CInt -> Ptr Float -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "chpmv_"
+   hpmv :: Ptr CChar -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "chpr_"
+   hpr :: Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> IO ()
+
+foreign import ccall "chpr2_"
+   hpr2 :: Ptr CChar -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> IO ()
+
+foreign import ccall "icamax_"
+   iamax :: Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO CInt
+
+foreign import ccall "crotg_"
+   rotg :: Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr Float -> Ptr (Complex Float) -> IO ()
+
+foreign import ccall "csrot_"
+   rrot :: Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr Float -> Ptr Float -> IO ()
+
+foreign import ccall "csscal_"
+   rscal :: Ptr CInt -> Ptr Float -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cscal_"
+   scal :: Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "cswap_"
+   swap :: Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "csymm_"
+   symm :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "csyr2k_"
+   syr2k :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "csyrk_"
+   syrk :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "ctbmv_"
+   tbmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "ctbsv_"
+   tbsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "ctpmv_"
+   tpmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "ctpsv_"
+   tpsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "ctrmm_"
+   trmm :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "ctrmv_"
+   trmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "ctrsm_"
+   trsm :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr (Complex Float) -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
+
+foreign import ccall "ctrsv_"
+   trsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO ()
diff --git a/src/Numeric/BLAS/FFI/Double.hs b/src/Numeric/BLAS/FFI/Double.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/BLAS/FFI/Double.hs
@@ -0,0 +1,112 @@
+-- Do not edit! Automatically generated by create-lapack-ffi.
+{-# LANGUAGE ForeignFunctionInterface #-}
+module Numeric.BLAS.FFI.Double where
+
+import Foreign.Ptr (Ptr)
+import Foreign.C.Types
+
+
+foreign import ccall "dasum_"
+   asum :: Ptr CInt -> Ptr Double -> Ptr CInt -> IO Double
+
+foreign import ccall "daxpy_"
+   axpy :: Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dcopy_"
+   copy :: Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "ddot_"
+   dot :: Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO Double
+
+foreign import ccall "dgbmv_"
+   gbmv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dgemm_"
+   gemm :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dgemv_"
+   gemv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dger_"
+   ger :: Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "idamax_"
+   iamax :: Ptr CInt -> Ptr Double -> Ptr CInt -> IO CInt
+
+foreign import ccall "dnrm2_"
+   nrm2 :: Ptr CInt -> Ptr Double -> Ptr CInt -> IO Double
+
+foreign import ccall "drot_"
+   rot :: Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> IO ()
+
+foreign import ccall "drotg_"
+   rotg :: Ptr Double -> Ptr Double -> Ptr Double -> Ptr Double -> IO ()
+
+foreign import ccall "drotm_"
+   rotm :: Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> IO ()
+
+foreign import ccall "drotmg_"
+   rotmg :: Ptr Double -> Ptr Double -> Ptr Double -> Ptr Double -> Ptr Double -> IO ()
+
+foreign import ccall "dsbmv_"
+   sbmv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dscal_"
+   scal :: Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dsdot_"
+   sdot :: Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO Double
+
+foreign import ccall "dspmv_"
+   spmv :: Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dspr_"
+   spr :: Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> IO ()
+
+foreign import ccall "dspr2_"
+   spr2 :: Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> IO ()
+
+foreign import ccall "dswap_"
+   swap :: Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dsymm_"
+   symm :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dsymv_"
+   symv :: Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dsyr_"
+   syr :: Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dsyr2_"
+   syr2 :: Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dsyr2k_"
+   syr2k :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dsyrk_"
+   syrk :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dtbmv_"
+   tbmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dtbsv_"
+   tbsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dtpmv_"
+   tpmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dtpsv_"
+   tpsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dtrmm_"
+   trmm :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dtrmv_"
+   trmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dtrsm_"
+   trsm :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Double -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
+
+foreign import ccall "dtrsv_"
+   trsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr Double -> Ptr CInt -> Ptr Double -> Ptr CInt -> IO ()
diff --git a/src/Numeric/BLAS/FFI/Float.hs b/src/Numeric/BLAS/FFI/Float.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/BLAS/FFI/Float.hs
@@ -0,0 +1,112 @@
+-- Do not edit! Automatically generated by create-lapack-ffi.
+{-# LANGUAGE ForeignFunctionInterface #-}
+module Numeric.BLAS.FFI.Float where
+
+import Foreign.Ptr (Ptr)
+import Foreign.C.Types
+
+
+foreign import ccall "sasum_"
+   asum :: Ptr CInt -> Ptr Float -> Ptr CInt -> IO Float
+
+foreign import ccall "saxpy_"
+   axpy :: Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "scopy_"
+   copy :: Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "sdot_"
+   dot :: Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO Float
+
+foreign import ccall "sdsdot_"
+   dsdot :: Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO Float
+
+foreign import ccall "sgbmv_"
+   gbmv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "sgemm_"
+   gemm :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "sgemv_"
+   gemv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "sger_"
+   ger :: Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "isamax_"
+   iamax :: Ptr CInt -> Ptr Float -> Ptr CInt -> IO CInt
+
+foreign import ccall "snrm2_"
+   nrm2 :: Ptr CInt -> Ptr Float -> Ptr CInt -> IO Float
+
+foreign import ccall "srot_"
+   rot :: Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr Float -> IO ()
+
+foreign import ccall "srotg_"
+   rotg :: Ptr Float -> Ptr Float -> Ptr Float -> Ptr Float -> IO ()
+
+foreign import ccall "srotm_"
+   rotm :: Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> IO ()
+
+foreign import ccall "srotmg_"
+   rotmg :: Ptr Float -> Ptr Float -> Ptr Float -> Ptr Float -> Ptr Float -> IO ()
+
+foreign import ccall "ssbmv_"
+   sbmv :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "sscal_"
+   scal :: Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "sspmv_"
+   spmv :: Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "sspr_"
+   spr :: Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> IO ()
+
+foreign import ccall "sspr2_"
+   spr2 :: Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> IO ()
+
+foreign import ccall "sswap_"
+   swap :: Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "ssymm_"
+   symm :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "ssymv_"
+   symv :: Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "ssyr_"
+   syr :: Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "ssyr2_"
+   syr2 :: Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "ssyr2k_"
+   syr2k :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "ssyrk_"
+   syrk :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "stbmv_"
+   tbmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "stbsv_"
+   tbsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "stpmv_"
+   tpmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "stpsv_"
+   tpsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "strmm_"
+   trmm :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "strmv_"
+   trmv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "strsm_"
+   trsm :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr Float -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
+
+foreign import ccall "strsv_"
+   trsv :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr Float -> Ptr CInt -> Ptr Float -> Ptr CInt -> IO ()
diff --git a/src/Numeric/BLAS/FFI/Generic.hs b/src/Numeric/BLAS/FFI/Generic.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/BLAS/FFI/Generic.hs
@@ -0,0 +1,147 @@
+-- Do not edit! Automatically generated by create-lapack-ffi.
+module Numeric.BLAS.FFI.Generic (
+   axpy,
+   copy,
+   gbmv,
+   gemm,
+   gemv,
+   iamax,
+   scal,
+   swap,
+   symm,
+   syr2k,
+   syrk,
+   tbmv,
+   tbsv,
+   tpmv,
+   tpsv,
+   trmm,
+   trmv,
+   trsm,
+   trsv,
+   ) where
+
+import qualified Numeric.BLAS.FFI.ComplexFloat as C
+import qualified Numeric.BLAS.FFI.ComplexDouble as Z
+import qualified Numeric.BLAS.FFI.Float as S
+import qualified Numeric.BLAS.FFI.Double as D
+
+import qualified Numeric.Netlib.Class as Class
+
+import Foreign.Ptr (Ptr)
+import Foreign.C.Types
+
+
+
+newtype AXPY a = AXPY {getAXPY :: Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+axpy :: Class.Floating a => Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+axpy = getAXPY $ Class.switchFloating (AXPY S.axpy) (AXPY D.axpy) (AXPY C.axpy) (AXPY Z.axpy)
+
+
+newtype COPY a = COPY {getCOPY :: Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+copy :: Class.Floating a => Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+copy = getCOPY $ Class.switchFloating (COPY S.copy) (COPY D.copy) (COPY C.copy) (COPY Z.copy)
+
+
+newtype GBMV a = GBMV {getGBMV :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+gbmv :: Class.Floating a => Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+gbmv = getGBMV $ Class.switchFloating (GBMV S.gbmv) (GBMV D.gbmv) (GBMV C.gbmv) (GBMV Z.gbmv)
+
+
+newtype GEMM a = GEMM {getGEMM :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+gemm :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+gemm = getGEMM $ Class.switchFloating (GEMM S.gemm) (GEMM D.gemm) (GEMM C.gemm) (GEMM Z.gemm)
+
+
+newtype GEMV a = GEMV {getGEMV :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+gemv :: Class.Floating a => Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+gemv = getGEMV $ Class.switchFloating (GEMV S.gemv) (GEMV D.gemv) (GEMV C.gemv) (GEMV Z.gemv)
+
+
+newtype IAMAX a = IAMAX {getIAMAX :: Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt}
+
+iamax :: Class.Floating a => Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
+iamax = getIAMAX $ Class.switchFloating (IAMAX S.iamax) (IAMAX D.iamax) (IAMAX C.iamax) (IAMAX Z.iamax)
+
+
+newtype SCAL a = SCAL {getSCAL :: Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+scal :: Class.Floating a => Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+scal = getSCAL $ Class.switchFloating (SCAL S.scal) (SCAL D.scal) (SCAL C.scal) (SCAL Z.scal)
+
+
+newtype SWAP a = SWAP {getSWAP :: Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+swap :: Class.Floating a => Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+swap = getSWAP $ Class.switchFloating (SWAP S.swap) (SWAP D.swap) (SWAP C.swap) (SWAP Z.swap)
+
+
+newtype SYMM a = SYMM {getSYMM :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+symm :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+symm = getSYMM $ Class.switchFloating (SYMM S.symm) (SYMM D.symm) (SYMM C.symm) (SYMM Z.symm)
+
+
+newtype SYR2K a = SYR2K {getSYR2K :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+syr2k :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+syr2k = getSYR2K $ Class.switchFloating (SYR2K S.syr2k) (SYR2K D.syr2k) (SYR2K C.syr2k) (SYR2K Z.syr2k)
+
+
+newtype SYRK a = SYRK {getSYRK :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+syrk :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+syrk = getSYRK $ Class.switchFloating (SYRK S.syrk) (SYRK D.syrk) (SYRK C.syrk) (SYRK Z.syrk)
+
+
+newtype TBMV a = TBMV {getTBMV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+tbmv :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+tbmv = getTBMV $ Class.switchFloating (TBMV S.tbmv) (TBMV D.tbmv) (TBMV C.tbmv) (TBMV Z.tbmv)
+
+
+newtype TBSV a = TBSV {getTBSV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+tbsv :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+tbsv = getTBSV $ Class.switchFloating (TBSV S.tbsv) (TBSV D.tbsv) (TBSV C.tbsv) (TBSV Z.tbsv)
+
+
+newtype TPMV a = TPMV {getTPMV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+tpmv :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+tpmv = getTPMV $ Class.switchFloating (TPMV S.tpmv) (TPMV D.tpmv) (TPMV C.tpmv) (TPMV Z.tpmv)
+
+
+newtype TPSV a = TPSV {getTPSV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+tpsv :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+tpsv = getTPSV $ Class.switchFloating (TPSV S.tpsv) (TPSV D.tpsv) (TPSV C.tpsv) (TPSV Z.tpsv)
+
+
+newtype TRMM a = TRMM {getTRMM :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+trmm :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+trmm = getTRMM $ Class.switchFloating (TRMM S.trmm) (TRMM D.trmm) (TRMM C.trmm) (TRMM Z.trmm)
+
+
+newtype TRMV a = TRMV {getTRMV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+trmv :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+trmv = getTRMV $ Class.switchFloating (TRMV S.trmv) (TRMV D.trmv) (TRMV C.trmv) (TRMV Z.trmv)
+
+
+newtype TRSM a = TRSM {getTRSM :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+trsm :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+trsm = getTRSM $ Class.switchFloating (TRSM S.trsm) (TRSM D.trsm) (TRSM C.trsm) (TRSM Z.trsm)
+
+
+newtype TRSV a = TRSV {getTRSV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+trsv :: Class.Floating a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+trsv = getTRSV $ Class.switchFloating (TRSV S.trsv) (TRSV D.trsv) (TRSV C.trsv) (TRSV Z.trsv)
diff --git a/src/Numeric/BLAS/FFI/Miscellaneous.hs b/src/Numeric/BLAS/FFI/Miscellaneous.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/BLAS/FFI/Miscellaneous.hs
@@ -0,0 +1,10 @@
+-- Do not edit! Automatically generated by create-lapack-ffi.
+{-# LANGUAGE ForeignFunctionInterface #-}
+module Numeric.BLAS.FFI.Miscellaneous where
+
+import Foreign.Ptr (Ptr)
+import Foreign.C.Types
+
+
+foreign import ccall "lsame_"
+   lsame :: Ptr CChar -> Ptr CChar -> IO Bool
diff --git a/src/Numeric/BLAS/FFI/Real.hs b/src/Numeric/BLAS/FFI/Real.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/BLAS/FFI/Real.hs
@@ -0,0 +1,250 @@
+-- Do not edit! Automatically generated by create-lapack-ffi.
+module Numeric.BLAS.FFI.Real (
+   asum,
+   axpy,
+   copy,
+   dot,
+   gbmv,
+   gemm,
+   gemv,
+   ger,
+   iamax,
+   nrm2,
+   rot,
+   rotg,
+   rotm,
+   rotmg,
+   sbmv,
+   scal,
+   spmv,
+   spr,
+   spr2,
+   swap,
+   symm,
+   symv,
+   syr,
+   syr2,
+   syr2k,
+   syrk,
+   tbmv,
+   tbsv,
+   tpmv,
+   tpsv,
+   trmm,
+   trmv,
+   trsm,
+   trsv,
+   ) where
+
+import qualified Numeric.BLAS.FFI.Float as S
+import qualified Numeric.BLAS.FFI.Double as D
+
+import qualified Numeric.Netlib.Class as Class
+
+import Foreign.Ptr (Ptr)
+import Foreign.C.Types
+
+
+
+newtype ASUM a = ASUM {getASUM :: Ptr CInt -> Ptr a -> Ptr CInt -> IO a}
+
+asum :: Class.Real a => Ptr CInt -> Ptr a -> Ptr CInt -> IO a
+asum = getASUM $ Class.switchReal (ASUM S.asum) (ASUM D.asum)
+
+
+newtype AXPY a = AXPY {getAXPY :: Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+axpy :: Class.Real a => Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+axpy = getAXPY $ Class.switchReal (AXPY S.axpy) (AXPY D.axpy)
+
+
+newtype COPY a = COPY {getCOPY :: Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+copy :: Class.Real a => Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+copy = getCOPY $ Class.switchReal (COPY S.copy) (COPY D.copy)
+
+
+newtype DOT a = DOT {getDOT :: Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO a}
+
+dot :: Class.Real a => Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO a
+dot = getDOT $ Class.switchReal (DOT S.dot) (DOT D.dot)
+
+
+newtype GBMV a = GBMV {getGBMV :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+gbmv :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+gbmv = getGBMV $ Class.switchReal (GBMV S.gbmv) (GBMV D.gbmv)
+
+
+newtype GEMM a = GEMM {getGEMM :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+gemm :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+gemm = getGEMM $ Class.switchReal (GEMM S.gemm) (GEMM D.gemm)
+
+
+newtype GEMV a = GEMV {getGEMV :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+gemv :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+gemv = getGEMV $ Class.switchReal (GEMV S.gemv) (GEMV D.gemv)
+
+
+newtype GER a = GER {getGER :: Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+ger :: Class.Real a => Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+ger = getGER $ Class.switchReal (GER S.ger) (GER D.ger)
+
+
+newtype IAMAX a = IAMAX {getIAMAX :: Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt}
+
+iamax :: Class.Real a => Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
+iamax = getIAMAX $ Class.switchReal (IAMAX S.iamax) (IAMAX D.iamax)
+
+
+newtype NRM2 a = NRM2 {getNRM2 :: Ptr CInt -> Ptr a -> Ptr CInt -> IO a}
+
+nrm2 :: Class.Real a => Ptr CInt -> Ptr a -> Ptr CInt -> IO a
+nrm2 = getNRM2 $ Class.switchReal (NRM2 S.nrm2) (NRM2 D.nrm2)
+
+
+newtype ROT a = ROT {getROT :: Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> IO ()}
+
+rot :: Class.Real a => Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> IO ()
+rot = getROT $ Class.switchReal (ROT S.rot) (ROT D.rot)
+
+
+newtype ROTG a = ROTG {getROTG :: Ptr a -> Ptr a -> Ptr a -> Ptr a -> IO ()}
+
+rotg :: Class.Real a => Ptr a -> Ptr a -> Ptr a -> Ptr a -> IO ()
+rotg = getROTG $ Class.switchReal (ROTG S.rotg) (ROTG D.rotg)
+
+
+newtype ROTM a = ROTM {getROTM :: Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> IO ()}
+
+rotm :: Class.Real a => Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> IO ()
+rotm = getROTM $ Class.switchReal (ROTM S.rotm) (ROTM D.rotm)
+
+
+newtype ROTMG a = ROTMG {getROTMG :: Ptr a -> Ptr a -> Ptr a -> Ptr a -> Ptr a -> IO ()}
+
+rotmg :: Class.Real a => Ptr a -> Ptr a -> Ptr a -> Ptr a -> Ptr a -> IO ()
+rotmg = getROTMG $ Class.switchReal (ROTMG S.rotmg) (ROTMG D.rotmg)
+
+
+newtype SBMV a = SBMV {getSBMV :: Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+sbmv :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+sbmv = getSBMV $ Class.switchReal (SBMV S.sbmv) (SBMV D.sbmv)
+
+
+newtype SCAL a = SCAL {getSCAL :: Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+scal :: Class.Real a => Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+scal = getSCAL $ Class.switchReal (SCAL S.scal) (SCAL D.scal)
+
+
+newtype SPMV a = SPMV {getSPMV :: Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+spmv :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+spmv = getSPMV $ Class.switchReal (SPMV S.spmv) (SPMV D.spmv)
+
+
+newtype SPR a = SPR {getSPR :: Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> IO ()}
+
+spr :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> IO ()
+spr = getSPR $ Class.switchReal (SPR S.spr) (SPR D.spr)
+
+
+newtype SPR2 a = SPR2 {getSPR2 :: Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> IO ()}
+
+spr2 :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> IO ()
+spr2 = getSPR2 $ Class.switchReal (SPR2 S.spr2) (SPR2 D.spr2)
+
+
+newtype SWAP a = SWAP {getSWAP :: Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+swap :: Class.Real a => Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+swap = getSWAP $ Class.switchReal (SWAP S.swap) (SWAP D.swap)
+
+
+newtype SYMM a = SYMM {getSYMM :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+symm :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+symm = getSYMM $ Class.switchReal (SYMM S.symm) (SYMM D.symm)
+
+
+newtype SYMV a = SYMV {getSYMV :: Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+symv :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+symv = getSYMV $ Class.switchReal (SYMV S.symv) (SYMV D.symv)
+
+
+newtype SYR a = SYR {getSYR :: Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+syr :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+syr = getSYR $ Class.switchReal (SYR S.syr) (SYR D.syr)
+
+
+newtype SYR2 a = SYR2 {getSYR2 :: Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+syr2 :: Class.Real a => Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+syr2 = getSYR2 $ Class.switchReal (SYR2 S.syr2) (SYR2 D.syr2)
+
+
+newtype SYR2K a = SYR2K {getSYR2K :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+syr2k :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+syr2k = getSYR2K $ Class.switchReal (SYR2K S.syr2k) (SYR2K D.syr2k)
+
+
+newtype SYRK a = SYRK {getSYRK :: Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+syrk :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+syrk = getSYRK $ Class.switchReal (SYRK S.syrk) (SYRK D.syrk)
+
+
+newtype TBMV a = TBMV {getTBMV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+tbmv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+tbmv = getTBMV $ Class.switchReal (TBMV S.tbmv) (TBMV D.tbmv)
+
+
+newtype TBSV a = TBSV {getTBSV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+tbsv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+tbsv = getTBSV $ Class.switchReal (TBSV S.tbsv) (TBSV D.tbsv)
+
+
+newtype TPMV a = TPMV {getTPMV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+tpmv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+tpmv = getTPMV $ Class.switchReal (TPMV S.tpmv) (TPMV D.tpmv)
+
+
+newtype TPSV a = TPSV {getTPSV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()}
+
+tpsv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> IO ()
+tpsv = getTPSV $ Class.switchReal (TPSV S.tpsv) (TPSV D.tpsv)
+
+
+newtype TRMM a = TRMM {getTRMM :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+trmm :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+trmm = getTRMM $ Class.switchReal (TRMM S.trmm) (TRMM D.trmm)
+
+
+newtype TRMV a = TRMV {getTRMV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+trmv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+trmv = getTRMV $ Class.switchReal (TRMV S.trmv) (TRMV D.trmv)
+
+
+newtype TRSM a = TRSM {getTRSM :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+trsm :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr CInt -> Ptr a -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+trsm = getTRSM $ Class.switchReal (TRSM S.trsm) (TRSM D.trsm)
+
+
+newtype TRSV a = TRSV {getTRSV :: Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()}
+
+trsv :: Class.Real a => Ptr CChar -> Ptr CChar -> Ptr CChar -> Ptr CInt -> Ptr a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO ()
+trsv = getTRSV $ Class.switchReal (TRSV S.trsv) (TRSV D.trsv)
