MyNixOS website logo
Description

Haskell bindings for SoftFloat.

Provides a pure functional interface to John Hauser's SoftFloat, an implementation of IEEE floating point in the C programming language.

softfloat-hs - Haskell bindings for SoftFloat.

copyright (c) Ben Selfridge, Galois Inc. 2018

This library consists primarily of a Haskell interface to John Hauser's SoftFloat library (http://www.jhauser.us/arithmetic/SoftFloat.html). It provides a pure interface to the functions in that library; while the C library is actually impure, reading and writing to global variables (rounding mode, exceptions), the Haskell functions have a pure interface, and those variables that were global in the original library are captured as input arguments and additional outputs of each function.

Installation

We assume you have already installed the Haskell stack build tool

Step 1: Install softfloat

SoftFloat is not too complicated to install, but it is best to build a dynamic library so that softfloat-hs can be loaded into ghci (which does not support statically linked C libraries). For convenience, we provide SoftFloat itself as a submodule, as well as a script to install it on OSX:

$ git submodule init --update --recursive
$ ./install-softfloat-osx.sh

If you are on a Linux system, use:

$ git submodule init --update --recursive
$ sudo ./install-softfloat-linux.sh

Step 2: Build softfloat-hs with stack

stack build

Step 3: Test softfloat-hs

stack ghci
> let Result x flags = ui32ToF32 RoundNearEven 23
> :m +Numeric
> showHex x ""
"41b80000"
> flags
ExceptionFlags {inexact = False, underflow = False, overflow = False, infinite = False, invalid = False}
> let Result y flags = ui32ToF32 RoundNearEven 3
> showHex y ""
"40400000"
> let Result z flags = f32Div RoundNearEven x y
> showHex z ""
"40f55555"
> flags
ExceptionFlags {inexact = True, underflow = False, overflow = False, infinite = False, invalid = False}

Requirements

The following are a list of mandatory and secondary requirements for softfloat-hs.

Mandatory Requirements

  • Must provide a "pure" Haskell interface to all of the SoftFloat functions.
  • Must make explicit ALL global variables involved.

Secondary Requirements

  • Support 80-bit and 128-bit operations.

Current Status

The library is functional, although a few global variables are not yet captured (whether underflow is detected before or after rounding, for example).

Other information

Metadata

Version

0.1.0

Platforms (77)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-windows
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows