    {-# LANGUAGE OverloadedStrings #-}
    {-# LANGUAGE BlockArguments #-}
    {-# LANGUAGE MultiWayIf #-}

    -- disable this warning because of all the lambdas matching on primops'
    -- arguments.
    {-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}

    module GHC.StgToJS.Prim
      ( genPrim
      )
    where

    import GHC.Prelude

    import GHC.JS.JStg.Syntax hiding (YieldOp)
    import GHC.JS.JStg.Monad
    import GHC.JS.Make
    import GHC.JS.Ident

    import GHC.StgToJS.Heap
    import GHC.StgToJS.Types
    import GHC.StgToJS.Profiling
    import GHC.StgToJS.Regs

    import GHC.Core.Type

    import GHC.Builtin.PrimOps
    import GHC.Tc.Utils.TcType (isBoolTy)
    import GHC.Utils.Encoding (zEncodeString)

    import GHC.Data.FastString
    import GHC.Utils.Outputable (renderWithContext, defaultSDocContext, ppr)

    genPrim :: Bool     -- ^ Profiling (cost-centres) enabled
            -> Bool     -- ^ Array bounds-checking enabled
            -> Type
            -> PrimOp   -- ^ the primitive operation
            -> [JStgExpr]  -- ^ where to store the result
            -> [JStgExpr]  -- ^ arguments
            -> JSM PrimRes
    genPrim :: Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    op = case PrimOp
    op of
      PrimOp
    CharGtOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    y)
      PrimOp
    CharGeOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>=. JStgExpr
    y)
      PrimOp
    CharEqOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    y)
      PrimOp
    CharNeOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    y)
      PrimOp
    CharLtOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    y)
      PrimOp
    CharLeOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<=. JStgExpr
    y)
      PrimOp
    OrdOp           -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x

      PrimOp
    Int8ToWord8Op   -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask8 JStgExpr
    x
      PrimOp
    Word8ToInt8Op   -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 JStgExpr
    x
      PrimOp
    Int16ToWord16Op -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask16 JStgExpr
    x
      PrimOp
    Word16ToInt16Op -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 JStgExpr
    x
      PrimOp
    Int32ToWord32Op -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. JStgExpr
    zero_
      PrimOp
    Word32ToInt32Op -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 JStgExpr
    x

    ------------------------------ Int ----------------------------------------------

      PrimOp
    IntAddOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    x JStgExpr
    y)
      PrimOp
    IntSubOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 (JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    x JStgExpr
    y)
      PrimOp
    IntMulOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "Math.imul" [JStgExpr
    x, JStgExpr
    y]
      PrimOp
    IntMul2Op       -> \[JStgExpr
    c,JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    c,JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_timesInt2" [JStgExpr
    x, JStgExpr
    y]
      PrimOp
    IntMulMayOfloOp -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> do
        JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes)
    -> StateT JEnv Identity JStgStat -> JSM PrimRes
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$>
          (JStgExpr -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    forall t.
    (JVarMagic t, ToJExpr t) =>
    (t -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    jVar \JStgExpr
    tmp ->
                 JStgStat -> StateT JEnv Identity JStgStat
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (JStgStat -> StateT JEnv Identity JStgStat)
    -> JStgStat -> StateT JEnv Identity JStgStat
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                 [ JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Mul JStgExpr
    x JStgExpr
    y
                 , JStgExpr
    r   JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if01 (JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr -> JStgExpr
    toI32 JStgExpr
    tmp)
                 ]
      PrimOp
    IntQuotOp       -> \[JStgExpr
    r]   [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 (JStgExpr -> JStgExpr -> JStgExpr
    Div JStgExpr
    x JStgExpr
    y)
      PrimOp
    IntRemOp        -> \[JStgExpr
    r]   [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Mod JStgExpr
    x JStgExpr
    y
      PrimOp
    IntQuotRemOp    -> \[JStgExpr
    q,JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                                         [ JStgExpr
    q JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 (JStgExpr -> JStgExpr -> JStgExpr
    Div JStgExpr
    x JStgExpr
    y)
                                         , JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    `Sub` (JStgExpr -> JStgExpr -> JStgExpr
    Mul JStgExpr
    y JStgExpr
    q)
                                         ]
      PrimOp
    IntAndOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BAnd JStgExpr
    x JStgExpr
    y
      PrimOp
    IntOrOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BOr  JStgExpr
    x JStgExpr
    y
      PrimOp
    IntXorOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BXor JStgExpr
    x JStgExpr
    y
      PrimOp
    IntNotOp        -> \[JStgExpr
    r] [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    BNot JStgExpr
    x

      PrimOp
    IntNegOp        -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 (JStgExpr -> JStgExpr
    Negate JStgExpr
    x)
    -- add with carry: overflow == 0 iff no overflow
      PrimOp
    IntAddCOp       -> \[JStgExpr
    r,JStgExpr
    overf] [JStgExpr
    x,JStgExpr
    y] ->
        JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes)
    -> StateT JEnv Identity JStgStat -> JSM PrimRes
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$>
        (JStgExpr -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    forall t.
    (JVarMagic t, ToJExpr t) =>
    (t -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    jVar \JStgExpr
    tmp ->
               JStgStat -> StateT JEnv Identity JStgStat
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (JStgStat -> StateT JEnv Identity JStgStat)
    -> JStgStat -> StateT JEnv Identity JStgStat
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
               [ JStgExpr
    tmp   JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    x JStgExpr
    y
               , JStgExpr
    r     JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 JStgExpr
    tmp
               , JStgExpr
    overf JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    r JStgExpr -> JStgExpr -> JStgExpr
    .!=. JStgExpr
    tmp)
               ]
      PrimOp
    IntSubCOp       -> \[JStgExpr
    r,JStgExpr
    overf] [JStgExpr
    x,JStgExpr
    y] ->
        JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes)
    -> StateT JEnv Identity JStgStat -> JSM PrimRes
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$>
        (JStgExpr -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    forall t.
    (JVarMagic t, ToJExpr t) =>
    (t -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    jVar \JStgExpr
    tmp ->
               JStgStat -> StateT JEnv Identity JStgStat
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (JStgStat -> StateT JEnv Identity JStgStat)
    -> JStgStat -> StateT JEnv Identity JStgStat
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
               [ JStgExpr
    tmp   JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    x JStgExpr
    y
               , JStgExpr
    r     JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 JStgExpr
    tmp
               , JStgExpr
    overf JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    r JStgExpr -> JStgExpr -> JStgExpr
    .!=. JStgExpr
    tmp)
               ]
      PrimOp
    IntGtOp           -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    y)
      PrimOp
    IntGeOp           -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>=. JStgExpr
    y)
      PrimOp
    IntEqOp           -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    y)
      PrimOp
    IntNeOp           -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10(JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    y)
      PrimOp
    IntLtOp           -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    y)
      PrimOp
    IntLeOp           -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<=. JStgExpr
    y)
      PrimOp
    ChrOp             -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    IntToWordOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. JStgExpr
    zero_
      PrimOp
    IntToFloatOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    IntToDoubleOp     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    IntSllOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    y
      PrimOp
    IntSraOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>. JStgExpr
    y
      PrimOp
    IntSrlOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. JStgExpr
    y)

    ------------------------------ Int8 ---------------------------------------------

      PrimOp
    Int8ToIntOp       -> \[JStgExpr
    r] [JStgExpr
    x]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    IntToInt8Op       -> \[JStgExpr
    r] [JStgExpr
    x]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 JStgExpr
    x
      PrimOp
    Int8NegOp         -> \[JStgExpr
    r] [JStgExpr
    x]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 (JStgExpr -> JStgExpr
    Negate JStgExpr
    x)
      PrimOp
    Int8AddOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    x JStgExpr
    y)
      PrimOp
    Int8SubOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 (JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    x JStgExpr
    y)
      PrimOp
    Int8MulOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 (JStgExpr -> JStgExpr -> JStgExpr
    Mul JStgExpr
    x JStgExpr
    y)
      PrimOp
    Int8QuotOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 (Int -> JStgExpr -> JStgExpr -> JStgExpr
    quotShortInt Int
    8 JStgExpr
    x JStgExpr
    y)
      PrimOp
    Int8RemOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 (Int -> JStgExpr -> JStgExpr -> JStgExpr
    remShortInt Int
    8 JStgExpr
    x JStgExpr
    y)
      PrimOp
    Int8QuotRemOp     -> \[JStgExpr
    r1,JStgExpr
    r2] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                                             [ JStgExpr
    r1 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 (Int -> JStgExpr -> JStgExpr -> JStgExpr
    quotShortInt Int
    8 JStgExpr
    x JStgExpr
    y)
                                             , JStgExpr
    r2 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 (Int -> JStgExpr -> JStgExpr -> JStgExpr
    remShortInt Int
    8 JStgExpr
    x JStgExpr
    y)
                                             ]
      PrimOp
    Int8EqOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    y)
      PrimOp
    Int8GeOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 ((JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    24)) JStgExpr -> JStgExpr -> JStgExpr
    .>=. (JStgExpr
    y JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    24)))
      PrimOp
    Int8GtOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 ((JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    24)) JStgExpr -> JStgExpr -> JStgExpr
    .>.  (JStgExpr
    y JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    24)))
      PrimOp
    Int8LeOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 ((JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    24)) JStgExpr -> JStgExpr -> JStgExpr
    .<=. (JStgExpr
    y JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    24)))
      PrimOp
    Int8LtOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 ((JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    24)) JStgExpr -> JStgExpr -> JStgExpr
    .<.  (JStgExpr
    y JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    24)))
      PrimOp
    Int8NeOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    y)

      PrimOp
    Int8SraOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>. JStgExpr
    i
      PrimOp
    Int8SrlOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 (JStgExpr -> JStgExpr
    mask8 JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. JStgExpr
    i)
      PrimOp
    Int8SllOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8 (JStgExpr -> JStgExpr
    mask8 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    i))

    ------------------------------ Word8 --------------------------------------------

      PrimOp
    Word8ToWordOp      -> \[JStgExpr
    r] [JStgExpr
    x]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask8 JStgExpr
    x
      PrimOp
    WordToWord8Op      -> \[JStgExpr
    r] [JStgExpr
    x]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask8 JStgExpr
    x

      PrimOp
    Word8AddOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask8 (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    x JStgExpr
    y)
      PrimOp
    Word8SubOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask8 (JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    x JStgExpr
    y)
      PrimOp
    Word8MulOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask8 (JStgExpr -> JStgExpr -> JStgExpr
    Mul JStgExpr
    x JStgExpr
    y)
      PrimOp
    Word8QuotOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask8 (JStgExpr -> JStgExpr -> JStgExpr
    Div JStgExpr
    x JStgExpr
    y)
      PrimOp
    Word8RemOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Mod JStgExpr
    x JStgExpr
    y
      PrimOp
    Word8QuotRemOp     -> \[JStgExpr
    r1,JStgExpr
    r2] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                                              [ JStgExpr
    r1 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 (JStgExpr -> JStgExpr -> JStgExpr
    Div JStgExpr
    x JStgExpr
    y)
                                              , JStgExpr
    r2 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Mod JStgExpr
    x JStgExpr
    y
                                              ]
      PrimOp
    Word8EqOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    y)
      PrimOp
    Word8GeOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>=. JStgExpr
    y)
      PrimOp
    Word8GtOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    y)
      PrimOp
    Word8LeOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<=. JStgExpr
    y)
      PrimOp
    Word8LtOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    y)
      PrimOp
    Word8NeOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    y)

      PrimOp
    Word8AndOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BAnd JStgExpr
    x JStgExpr
    y
      PrimOp
    Word8OrOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BOr  JStgExpr
    x JStgExpr
    y
      PrimOp
    Word8XorOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BXor JStgExpr
    x JStgExpr
    y
      PrimOp
    Word8NotOp         -> \[JStgExpr
    r] [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BXor JStgExpr
    x (Integer -> JStgExpr
    Int Integer
    0xff)

      PrimOp
    Word8SllOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask8 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    i)
      PrimOp
    Word8SrlOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. JStgExpr
    i

    ------------------------------ Int16 -------------------------------------------

      PrimOp
    Int16ToIntOp       -> \[JStgExpr
    r] [JStgExpr
    x]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    IntToInt16Op       -> \[JStgExpr
    r] [JStgExpr
    x]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 JStgExpr
    x

      PrimOp
    Int16NegOp         -> \[JStgExpr
    r] [JStgExpr
    x]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 (JStgExpr -> JStgExpr
    Negate JStgExpr
    x)
      PrimOp
    Int16AddOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    x JStgExpr
    y)
      PrimOp
    Int16SubOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 (JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    x JStgExpr
    y)
      PrimOp
    Int16MulOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 (JStgExpr -> JStgExpr -> JStgExpr
    Mul JStgExpr
    x JStgExpr
    y)
      PrimOp
    Int16QuotOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 (Int -> JStgExpr -> JStgExpr -> JStgExpr
    quotShortInt Int
    16 JStgExpr
    x JStgExpr
    y)
      PrimOp
    Int16RemOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 (Int -> JStgExpr -> JStgExpr -> JStgExpr
    remShortInt Int
    16 JStgExpr
    x JStgExpr
    y)
      PrimOp
    Int16QuotRemOp     -> \[JStgExpr
    r1,JStgExpr
    r2] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                                              [ JStgExpr
    r1 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 (Int -> JStgExpr -> JStgExpr -> JStgExpr
    quotShortInt Int
    16 JStgExpr
    x JStgExpr
    y)
                                              , JStgExpr
    r2 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 (Int -> JStgExpr -> JStgExpr -> JStgExpr
    remShortInt Int
    16 JStgExpr
    x JStgExpr
    y)
                                              ]
      PrimOp
    Int16EqOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    y)
      PrimOp
    Int16GeOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 ((JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    16)) JStgExpr -> JStgExpr -> JStgExpr
    .>=. (JStgExpr
    y JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    16)))
      PrimOp
    Int16GtOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 ((JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    16)) JStgExpr -> JStgExpr -> JStgExpr
    .>.  (JStgExpr
    y JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    16)))
      PrimOp
    Int16LeOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 ((JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    16)) JStgExpr -> JStgExpr -> JStgExpr
    .<=. (JStgExpr
    y JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    16)))
      PrimOp
    Int16LtOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 ((JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    16)) JStgExpr -> JStgExpr -> JStgExpr
    .<.  (JStgExpr
    y JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    16)))
      PrimOp
    Int16NeOp          -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    y)

      PrimOp
    Int16SraOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>. JStgExpr
    i
      PrimOp
    Int16SrlOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 (JStgExpr -> JStgExpr
    mask16 JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. JStgExpr
    i)
      PrimOp
    Int16SllOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    i)

    ------------------------------ Word16 ------------------------------------------

      PrimOp
    Word16ToWordOp     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    WordToWord16Op     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask16 JStgExpr
    x

      PrimOp
    Word16AddOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask16 (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    x JStgExpr
    y)
      PrimOp
    Word16SubOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask16 (JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    x JStgExpr
    y)
      PrimOp
    Word16MulOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask16 (JStgExpr -> JStgExpr -> JStgExpr
    Mul JStgExpr
    x JStgExpr
    y)
      PrimOp
    Word16QuotOp       -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask16 (JStgExpr -> JStgExpr -> JStgExpr
    Div JStgExpr
    x JStgExpr
    y)
      PrimOp
    Word16RemOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Mod JStgExpr
    x JStgExpr
    y
      PrimOp
    Word16QuotRemOp    -> \[JStgExpr
    r1,JStgExpr
    r2] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                                              [ JStgExpr
    r1 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 (JStgExpr -> JStgExpr -> JStgExpr
    Div JStgExpr
    x JStgExpr
    y)
                                              , JStgExpr
    r2 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Mod JStgExpr
    x JStgExpr
    y
                                              ]
      PrimOp
    Word16EqOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    y)
      PrimOp
    Word16GeOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>=. JStgExpr
    y)
      PrimOp
    Word16GtOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    y)
      PrimOp
    Word16LeOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<=. JStgExpr
    y)
      PrimOp
    Word16LtOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    y)
      PrimOp
    Word16NeOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    y)

      PrimOp
    Word16AndOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BAnd JStgExpr
    x JStgExpr
    y
      PrimOp
    Word16OrOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BOr  JStgExpr
    x JStgExpr
    y
      PrimOp
    Word16XorOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BXor JStgExpr
    x JStgExpr
    y
      PrimOp
    Word16NotOp        -> \[JStgExpr
    r] [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BXor JStgExpr
    x (Integer -> JStgExpr
    Int Integer
    0xffff)

      PrimOp
    Word16SllOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask16 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    i)
      PrimOp
    Word16SrlOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. JStgExpr
    i

    ------------------------------ Int32 --------------------------------------------

      PrimOp
    Int32ToIntOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    IntToInt32Op       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x

      PrimOp
    Int32NegOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntNegOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32AddOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntAddOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32SubOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntSubOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32MulOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntMulOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32QuotOp        -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntQuotOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32RemOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntRemOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32QuotRemOp     -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntQuotRemOp [JStgExpr]
    rs [JStgExpr]
    xs

      PrimOp
    Int32EqOp          -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntEqOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32GeOp          -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntGeOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32GtOp          -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntGtOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32LeOp          -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntLeOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32LtOp          -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntLtOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32NeOp          -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntNeOp [JStgExpr]
    rs [JStgExpr]
    xs

      PrimOp
    Int32SraOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntSraOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32SrlOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntSrlOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Int32SllOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    IntSllOp [JStgExpr]
    rs [JStgExpr]
    xs

    ------------------------------ Word32 -------------------------------------------

      PrimOp
    Word32ToWordOp     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    WordToWord32Op     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x

      PrimOp
    Word32AddOp        -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordAddOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32SubOp        -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordSubOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32MulOp        -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordMulOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32QuotOp       -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordQuotOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32RemOp        -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordRemOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32QuotRemOp    -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordQuotRemOp [JStgExpr]
    rs [JStgExpr]
    xs

      PrimOp
    Word32EqOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordEqOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32GeOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordGeOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32GtOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordGtOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32LeOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordLeOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32LtOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordLtOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32NeOp         -> \[JStgExpr]
    rs  [JStgExpr]
    xs    -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordNeOp [JStgExpr]
    rs [JStgExpr]
    xs

      PrimOp
    Word32AndOp        -> \[JStgExpr]
    rs [JStgExpr]
    xs     -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordAndOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32OrOp         -> \[JStgExpr]
    rs [JStgExpr]
    xs     -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordOrOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32XorOp        -> \[JStgExpr]
    rs [JStgExpr]
    xs     -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordXorOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32NotOp        -> \[JStgExpr]
    rs [JStgExpr]
    xs     -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordNotOp [JStgExpr]
    rs [JStgExpr]
    xs

      PrimOp
    Word32SllOp        -> \[JStgExpr]
    rs [JStgExpr]
    xs     -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordSllOp [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Word32SrlOp        -> \[JStgExpr]
    rs [JStgExpr]
    xs     -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    WordSrlOp [JStgExpr]
    rs [JStgExpr]
    xs

    ------------------------------ Int64 --------------------------------------------

      PrimOp
    Int64ToIntOp      -> \[JStgExpr
    r] [JStgExpr
    _h,JStgExpr
    l] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 JStgExpr
    l

      PrimOp
    Int64NegOp        -> \[JStgExpr
    r_h,JStgExpr
    r_l] [JStgExpr
    h,JStgExpr
    l] ->
          PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
            [ JStgExpr
    r_l JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    Add (JStgExpr -> JStgExpr
    BNot JStgExpr
    l) JStgExpr
    one_)
            , JStgExpr
    r_h JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 (JStgExpr -> JStgExpr -> JStgExpr
    Add (JStgExpr -> JStgExpr
    BNot JStgExpr
    h) (JStgExpr -> JStgExpr
    Not JStgExpr
    r_l))
            ]

      PrimOp
    Int64AddOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_plusInt64"  [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1]
      PrimOp
    Int64SubOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_minusInt64" [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1]
      PrimOp
    Int64MulOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_timesInt64" [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1]
      PrimOp
    Int64QuotOp -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_quotInt64"  [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1]
      PrimOp
    Int64RemOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_remInt64"   [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1]

      PrimOp
    Int64SllOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h,JStgExpr
    l,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_uncheckedShiftLLInt64" [JStgExpr
    h,JStgExpr
    l,JStgExpr
    n]
      PrimOp
    Int64SraOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h,JStgExpr
    l,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_uncheckedShiftRAInt64" [JStgExpr
    h,JStgExpr
    l,JStgExpr
    n]
      PrimOp
    Int64SrlOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h,JStgExpr
    l,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_uncheckedShiftRLInt64" [JStgExpr
    h,JStgExpr
    l,JStgExpr
    n]

      PrimOp
    Int64ToWord64Op   -> \[JStgExpr
    r1,JStgExpr
    r2] [JStgExpr
    x1,JStgExpr
    x2] ->
          PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
           [ JStgExpr
    r1 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 JStgExpr
    x1
           , JStgExpr
    r2 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x2
           ]
      PrimOp
    IntToInt64Op      -> \[JStgExpr
    r1,JStgExpr
    r2] [JStgExpr
    x] ->
          PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
           [ JStgExpr
    r1 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr
    if_ (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    zero_) (JStgExpr -> JStgExpr
    Negate JStgExpr
    one_) JStgExpr
    zero_ -- sign-extension
           , JStgExpr
    r2 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 JStgExpr
    x
           ]

      PrimOp
    Int64EqOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LAnd (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    l1) (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    h1))
      PrimOp
    Int64NeOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LOr (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    l1) (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    h1))
      PrimOp
    Int64GeOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LOr (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    h1) (JStgExpr -> JStgExpr -> JStgExpr
    LAnd (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    h1) (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .>=. JStgExpr
    l1)))
      PrimOp
    Int64GtOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LOr (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    h1) (JStgExpr -> JStgExpr -> JStgExpr
    LAnd (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    h1) (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    l1)))
      PrimOp
    Int64LeOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LOr (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    h1) (JStgExpr -> JStgExpr -> JStgExpr
    LAnd (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    h1) (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .<=. JStgExpr
    l1)))
      PrimOp
    Int64LtOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LOr (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    h1) (JStgExpr -> JStgExpr -> JStgExpr
    LAnd (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    h1) (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    l1)))

    ------------------------------ Word64 -------------------------------------------

      PrimOp
    Word64ToWordOp    -> \[JStgExpr
    r] [JStgExpr
    _x1,JStgExpr
    x2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x2

      PrimOp
    WordToWord64Op    -> \[JStgExpr
    rh,JStgExpr
    rl] [JStgExpr
    x] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
         [ JStgExpr
    rh JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_
         , JStgExpr
    rl JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
         ]

      PrimOp
    Word64ToInt64Op   -> \[JStgExpr
    r1,JStgExpr
    r2] [JStgExpr
    x1,JStgExpr
    x2] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
         [ JStgExpr
    r1 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 JStgExpr
    x1
         , JStgExpr
    r2 JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x2
         ]

      PrimOp
    Word64EqOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LAnd (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    l1) (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    h1))
      PrimOp
    Word64NeOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LOr (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    l1) (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    h1))
      PrimOp
    Word64GeOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LOr (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    h1) (JStgExpr -> JStgExpr -> JStgExpr
    LAnd (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    h1) (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .>=. JStgExpr
    l1)))
      PrimOp
    Word64GtOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LOr (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    h1) (JStgExpr -> JStgExpr -> JStgExpr
    LAnd (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    h1) (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    l1)))
      PrimOp
    Word64LeOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LOr (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    h1) (JStgExpr -> JStgExpr -> JStgExpr
    LAnd (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    h1) (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .<=. JStgExpr
    l1)))
      PrimOp
    Word64LtOp -> \[JStgExpr
    r] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr -> JStgExpr -> JStgExpr
    LOr (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    h1) (JStgExpr -> JStgExpr -> JStgExpr
    LAnd (JStgExpr
    h0 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    h1) (JStgExpr
    l0 JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    l1)))

      PrimOp
    Word64SllOp -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h,JStgExpr
    l,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_uncheckedShiftLWord64" [JStgExpr
    h,JStgExpr
    l,JStgExpr
    n]
      PrimOp
    Word64SrlOp -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h,JStgExpr
    l,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_uncheckedShiftRWord64" [JStgExpr
    h,JStgExpr
    l,JStgExpr
    n]

      PrimOp
    Word64OrOp  -> \[JStgExpr
    hr,JStgExpr
    hl] [JStgExpr
    h0, JStgExpr
    l0, JStgExpr
    h1, JStgExpr
    l1] ->
          PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
            [ JStgExpr
    hr JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    BOr JStgExpr
    h0 JStgExpr
    h1)
            , JStgExpr
    hl JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    BOr JStgExpr
    l0 JStgExpr
    l1)
            ]

      PrimOp
    Word64AndOp -> \[JStgExpr
    hr,JStgExpr
    hl] [JStgExpr
    h0, JStgExpr
    l0, JStgExpr
    h1, JStgExpr
    l1] ->
          PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
            [ JStgExpr
    hr JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    BAnd JStgExpr
    h0 JStgExpr
    h1)
            , JStgExpr
    hl JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    BAnd JStgExpr
    l0 JStgExpr
    l1)
            ]

      PrimOp
    Word64XorOp -> \[JStgExpr
    hr,JStgExpr
    hl] [JStgExpr
    h0, JStgExpr
    l0, JStgExpr
    h1, JStgExpr
    l1] ->
          PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
            [ JStgExpr
    hr JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    BXor JStgExpr
    h0 JStgExpr
    h1)
            , JStgExpr
    hl JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    BXor JStgExpr
    l0 JStgExpr
    l1)
            ]

      PrimOp
    Word64NotOp -> \[JStgExpr
    hr,JStgExpr
    hl] [JStgExpr
    h, JStgExpr
    l] ->
          PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
            [ JStgExpr
    hr JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr
    BNot JStgExpr
    h)
            , JStgExpr
    hl JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr
    BNot JStgExpr
    l)
            ]

      PrimOp
    Word64AddOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_plusWord64"  [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1]
      PrimOp
    Word64SubOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_minusWord64" [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1]
      PrimOp
    Word64MulOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_timesWord64" [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1]
      PrimOp
    Word64QuotOp -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_quotWord64"  [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1]
      PrimOp
    Word64RemOp  -> \[JStgExpr
    hr,JStgExpr
    lr] [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    hr,JStgExpr
    lr] FastString
    "h$hs_remWord64"   [JStgExpr
    h0,JStgExpr
    l0,JStgExpr
    h1,JStgExpr
    l1]

    ------------------------------ Word ---------------------------------------------

      PrimOp
    WordAddOp  -> \[JStgExpr
    r]   [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    `Add` JStgExpr
    y) JStgExpr -> JStgExpr -> JStgExpr
    .>>>. JStgExpr
    zero_
      PrimOp
    WordAddCOp -> \[JStgExpr
    r,JStgExpr
    c] [JStgExpr
    x,JStgExpr
    y] ->
          JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes)
    -> StateT JEnv Identity JStgStat -> JSM PrimRes
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$>
          (JStgExpr -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    forall t.
    (JVarMagic t, ToJExpr t) =>
    (t -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    jVar \JStgExpr
    tmp ->
                 JStgStat -> StateT JEnv Identity JStgStat
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (JStgStat -> StateT JEnv Identity JStgStat)
    -> JStgStat -> StateT JEnv Identity JStgStat
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                 [ JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    `Add` JStgExpr
    y
                 , JStgExpr
    r   JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 JStgExpr
    tmp
                 , JStgExpr
    c   JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    r)
                 ]
      PrimOp
    WordSubCOp  -> \[JStgExpr
    r,JStgExpr
    c] [JStgExpr
    x,JStgExpr
    y] ->
          PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
            [ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    x JStgExpr
    y)
            , JStgExpr
    c JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    y JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    x)
            ]
      PrimOp
    WordAdd2Op    -> \[JStgExpr
    h,JStgExpr
    l] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    h,JStgExpr
    l] FastString
    "h$wordAdd2" [JStgExpr
    x,JStgExpr
    y]
      PrimOp
    WordSubOp     -> \  [JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    x JStgExpr
    y)
      PrimOp
    WordMulOp     -> \  [JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "Math.imul" [JStgExpr
    x, JStgExpr
    y])
      PrimOp
    WordMul2Op    -> \[JStgExpr
    h,JStgExpr
    l] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    h,JStgExpr
    l] FastString
    "h$mul2Word32" [JStgExpr
    x,JStgExpr
    y]
      PrimOp
    WordQuotOp    -> \  [JStgExpr
    q] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    q JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$quotWord32" [JStgExpr
    x,JStgExpr
    y]
      PrimOp
    WordRemOp     -> \  [JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$remWord32" [JStgExpr
    x,JStgExpr
    y]
      PrimOp
    WordQuotRemOp -> \[JStgExpr
    q,JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    q,JStgExpr
    r] FastString
    "h$quotRemWord32" [JStgExpr
    x,JStgExpr
    y]
      PrimOp
    WordQuotRem2Op   -> \[JStgExpr
    q,JStgExpr
    r] [JStgExpr
    xh,JStgExpr
    xl,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    q,JStgExpr
    r] FastString
    "h$quotRem2Word32" [JStgExpr
    xh,JStgExpr
    xl,JStgExpr
    y]
      PrimOp
    WordAndOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    BAnd JStgExpr
    x JStgExpr
    y)
      PrimOp
    WordOrOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    BOr  JStgExpr
    x JStgExpr
    y)
      PrimOp
    WordXorOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    BXor JStgExpr
    x JStgExpr
    y)
      PrimOp
    WordNotOp        -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr
    BNot JStgExpr
    x)
      PrimOp
    WordSllOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    y)
      PrimOp
    WordSrlOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. JStgExpr
    y
      PrimOp
    WordToIntOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 JStgExpr
    x
      PrimOp
    WordGtOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>.  JStgExpr
    y)
      PrimOp
    WordGeOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>=. JStgExpr
    y)
      PrimOp
    WordEqOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    y)
      PrimOp
    WordNeOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    y)
      PrimOp
    WordLtOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<.  JStgExpr
    y)
      PrimOp
    WordLeOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<=. JStgExpr
    y)
      PrimOp
    WordToDoubleOp   -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    WordToFloatOp    -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [JStgExpr
    x]
      PrimOp
    PopCnt8Op        -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> JStgExpr
    var FastString
    "h$popCntTab" JStgExpr -> JStgExpr -> JStgExpr
    .! (JStgExpr -> JStgExpr
    mask8 JStgExpr
    x)
      PrimOp
    PopCnt16Op       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Add (FastString -> JStgExpr
    var FastString
    "h$popCntTab" JStgExpr -> JStgExpr -> JStgExpr
    .! (JStgExpr -> JStgExpr
    mask8 JStgExpr
    x))
                                                          (FastString -> JStgExpr
    var FastString
    "h$popCntTab" JStgExpr -> JStgExpr -> JStgExpr
    .! (JStgExpr -> JStgExpr
    mask8 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. Integer -> JStgExpr
    Int Integer
    8)))

      PrimOp
    PopCnt32Op  -> \[JStgExpr
    r] [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$popCnt32" [JStgExpr
    x]
      PrimOp
    PopCnt64Op  -> \[JStgExpr
    r] [JStgExpr
    x1,JStgExpr
    x2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$popCnt64" [JStgExpr
    x1,JStgExpr
    x2]
      PrimOp
    PopCntOp    -> \[JStgExpr
    r] [JStgExpr
    x]     -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    PopCnt32Op [JStgExpr
    r] [JStgExpr
    x]
      PrimOp
    Pdep8Op     -> \[JStgExpr
    r] [JStgExpr
    s,JStgExpr
    m]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$pdep8"  [JStgExpr
    s,JStgExpr
    m]
      PrimOp
    Pdep16Op    -> \[JStgExpr
    r] [JStgExpr
    s,JStgExpr
    m]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$pdep16" [JStgExpr
    s,JStgExpr
    m]
      PrimOp
    Pdep32Op    -> \[JStgExpr
    r] [JStgExpr
    s,JStgExpr
    m]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$pdep32" [JStgExpr
    s,JStgExpr
    m]
      PrimOp
    Pdep64Op    -> \[JStgExpr
    ra,JStgExpr
    rb] [JStgExpr
    sa,JStgExpr
    sb,JStgExpr
    ma,JStgExpr
    mb] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    ra,JStgExpr
    rb] FastString
    "h$pdep64" [JStgExpr
    sa,JStgExpr
    sb,JStgExpr
    ma,JStgExpr
    mb]
      PrimOp
    PdepOp      -> \[JStgExpr]
    rs [JStgExpr]
    xs                 -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    Pdep32Op [JStgExpr]
    rs [JStgExpr]
    xs
      PrimOp
    Pext8Op     -> \[JStgExpr
    r] [JStgExpr
    s,JStgExpr
    m] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$pext8" [JStgExpr
    s,JStgExpr
    m]
      PrimOp
    Pext16Op    -> \[JStgExpr
    r] [JStgExpr
    s,JStgExpr
    m] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$pext16" [JStgExpr
    s,JStgExpr
    m]
      PrimOp
    Pext32Op    -> \[JStgExpr
    r] [JStgExpr
    s,JStgExpr
    m] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$pext32" [JStgExpr
    s,JStgExpr
    m]
      PrimOp
    Pext64Op    -> \[JStgExpr
    ra,JStgExpr
    rb] [JStgExpr
    sa,JStgExpr
    sb,JStgExpr
    ma,JStgExpr
    mb] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    ra,JStgExpr
    rb] FastString
    "h$pext64" [JStgExpr
    sa,JStgExpr
    sb,JStgExpr
    ma,JStgExpr
    mb]
      PrimOp
    PextOp      -> \[JStgExpr]
    rs [JStgExpr]
    xs     -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    Pext32Op [JStgExpr]
    rs [JStgExpr]
    xs

      PrimOp
    ClzOp       -> \[JStgExpr
    r]   [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$clz32" [JStgExpr
    x]
      PrimOp
    Clz8Op      -> \[JStgExpr
    r]   [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$clz8"  [JStgExpr
    x]
      PrimOp
    Clz16Op     -> \[JStgExpr
    r]   [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$clz16" [JStgExpr
    x]
      PrimOp
    Clz32Op     -> \[JStgExpr
    r]   [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$clz32" [JStgExpr
    x]
      PrimOp
    Clz64Op     -> \[JStgExpr
    r]   [JStgExpr
    x1,JStgExpr
    x2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$clz64" [JStgExpr
    x1,JStgExpr
    x2]
      PrimOp
    CtzOp       -> \[JStgExpr
    r]   [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$ctz32" [JStgExpr
    x]
      PrimOp
    Ctz8Op      -> \[JStgExpr
    r]   [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$ctz8"  [JStgExpr
    x]
      PrimOp
    Ctz16Op     -> \[JStgExpr
    r]   [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$ctz16" [JStgExpr
    x]
      PrimOp
    Ctz32Op     -> \[JStgExpr
    r]   [JStgExpr
    x]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$ctz32" [JStgExpr
    x]
      PrimOp
    Ctz64Op     -> \[JStgExpr
    r]   [JStgExpr
    x1,JStgExpr
    x2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$ctz64" [JStgExpr
    x1,JStgExpr
    x2]

      PrimOp
    BSwap16Op   -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $
          JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    BOr ((JStgExpr -> JStgExpr
    mask8 JStgExpr
    x) JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    8))
                   (JStgExpr -> JStgExpr
    mask8 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. (Integer -> JStgExpr
    Int Integer
    8)))
      PrimOp
    BSwap32Op   -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $
          JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32 ((JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    24))
                JStgExpr -> JStgExpr -> JStgExpr
    `BOr` ((JStgExpr -> JStgExpr -> JStgExpr
    BAnd JStgExpr
    x (Integer -> JStgExpr
    Int Integer
    0xFF00)) JStgExpr -> JStgExpr -> JStgExpr
    .<<. (Integer -> JStgExpr
    Int Integer
    8))
                JStgExpr -> JStgExpr -> JStgExpr
    `BOr` ((JStgExpr -> JStgExpr -> JStgExpr
    BAnd JStgExpr
    x (Integer -> JStgExpr
    Int Integer
    0xFF0000)) JStgExpr -> JStgExpr -> JStgExpr
    .>>. (Integer -> JStgExpr
    Int Integer
    8))
                JStgExpr -> JStgExpr -> JStgExpr
    `BOr` (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>>>. (Integer -> JStgExpr
    Int Integer
    24)))
      PrimOp
    BSwap64Op   -> \[JStgExpr
    r1,JStgExpr
    r2] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    r1,JStgExpr
    r2] FastString
    "h$bswap64" [JStgExpr
    x,JStgExpr
    y]
      PrimOp
    BSwapOp     -> \[JStgExpr
    r] [JStgExpr
    x]       -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    BSwap32Op [JStgExpr
    r] [JStgExpr
    x]

      PrimOp
    BRevOp      -> \[JStgExpr
    r] [JStgExpr
    w] -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    BRev32Op [JStgExpr
    r] [JStgExpr
    w]
      PrimOp
    BRev8Op     -> \[JStgExpr
    r] [JStgExpr
    w] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$reverseWord" [JStgExpr
    w] JStgExpr -> JStgExpr -> JStgExpr
    .>>>. Integer -> JStgExpr
    Int Integer
    24)
      PrimOp
    BRev16Op    -> \[JStgExpr
    r] [JStgExpr
    w] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$reverseWord" [JStgExpr
    w] JStgExpr -> JStgExpr -> JStgExpr
    .>>>. Integer -> JStgExpr
    Int Integer
    16)
      PrimOp
    BRev32Op    -> \[JStgExpr
    r] [JStgExpr
    w] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$reverseWord" [JStgExpr
    w]
      PrimOp
    BRev64Op    -> \[JStgExpr
    rh,JStgExpr
    rl] [JStgExpr
    h,JStgExpr
    l] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                               [ JStgExpr
    rl JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$reverseWord" [JStgExpr
    h]
                               , JStgExpr
    rh JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$reverseWord" [JStgExpr
    l]
                               ]

    ------------------------------ Narrow -------------------------------------------

      PrimOp
    Narrow8IntOp    -> \[JStgExpr
    r] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend8  JStgExpr
    x
      PrimOp
    Narrow16IntOp   -> \[JStgExpr
    r] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    signExtend16 JStgExpr
    x
      PrimOp
    Narrow32IntOp   -> \[JStgExpr
    r] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32  JStgExpr
    x
      PrimOp
    Narrow8WordOp   -> \[JStgExpr
    r] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask8  JStgExpr
    x
      PrimOp
    Narrow16WordOp  -> \[JStgExpr
    r] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    mask16 JStgExpr
    x
      PrimOp
    Narrow32WordOp  -> \[JStgExpr
    r] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toU32  JStgExpr
    x

    ------------------------------ Double -------------------------------------------

      PrimOp
    DoubleGtOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>.   JStgExpr
    y)
      PrimOp
    DoubleGeOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>=.  JStgExpr
    y)
      PrimOp
    DoubleEqOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    y)
      PrimOp
    DoubleNeOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    y)
      PrimOp
    DoubleLtOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<.   JStgExpr
    y)
      PrimOp
    DoubleLeOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<=.  JStgExpr
    y)
      PrimOp
    DoubleAddOp       -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    x JStgExpr
    y
      PrimOp
    DoubleSubOp       -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    x JStgExpr
    y
      PrimOp
    DoubleMulOp       -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Mul JStgExpr
    x JStgExpr
    y
      PrimOp
    DoubleDivOp       -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Div JStgExpr
    x JStgExpr
    y
      PrimOp
    DoubleNegOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    Negate JStgExpr
    x
      PrimOp
    DoubleFabsOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_abs [JStgExpr
    x]
      PrimOp
    DoubleToIntOp     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 JStgExpr
    x
      PrimOp
    DoubleToFloatOp   -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [JStgExpr
    x]
      PrimOp
    DoubleExpOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_exp  [JStgExpr
    x]
      PrimOp
    DoubleExpM1Op     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_expm1 [JStgExpr
    x]
      PrimOp
    DoubleLogOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_log  [JStgExpr
    x]
      PrimOp
    DoubleLog1POp     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_log1p [JStgExpr
    x]
      PrimOp
    DoubleSqrtOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_sqrt [JStgExpr
    x]
      PrimOp
    DoubleSinOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_sin  [JStgExpr
    x]
      PrimOp
    DoubleCosOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_cos  [JStgExpr
    x]
      PrimOp
    DoubleTanOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_tan  [JStgExpr
    x]
      PrimOp
    DoubleAsinOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_asin [JStgExpr
    x]
      PrimOp
    DoubleAcosOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_acos [JStgExpr
    x]
      PrimOp
    DoubleAtanOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_atan [JStgExpr
    x]
      PrimOp
    DoubleSinhOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_sinh [JStgExpr
    x]
      PrimOp
    DoubleCoshOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_cosh [JStgExpr
    x]
      PrimOp
    DoubleTanhOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_tanh [JStgExpr
    x]
      PrimOp
    DoubleAsinhOp     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_asinh [JStgExpr
    x]
      PrimOp
    DoubleAcoshOp     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_acosh [JStgExpr
    x]
      PrimOp
    DoubleAtanhOp     -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_atanh [JStgExpr
    x]
      PrimOp
    DoublePowerOp     -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_pow [JStgExpr
    x,JStgExpr
    y]
      PrimOp
    DoubleDecode_2IntOp  -> \[JStgExpr
    s,JStgExpr
    h,JStgExpr
    l,JStgExpr
    e] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    s,JStgExpr
    h,JStgExpr
    l,JStgExpr
    e] FastString
    "h$decodeDouble2Int" [JStgExpr
    x]
      PrimOp
    DoubleDecode_Int64Op -> \[JStgExpr
    s1,JStgExpr
    s2,JStgExpr
    e] [JStgExpr
    d] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    e,JStgExpr
    s1,JStgExpr
    s2] FastString
    "h$decodeDoubleInt64" [JStgExpr
    d]
      PrimOp
    CastDoubleToWord64Op -> \[JStgExpr
    rh,JStgExpr
    rl] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    rh,JStgExpr
    rl]   FastString
    "h$castDoubleToWord64" [JStgExpr
    x]
      PrimOp
    CastWord64ToDoubleOp -> \[JStgExpr
    r]     [JStgExpr
    h,JStgExpr
    l] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    r]       FastString
    "h$castWord64ToDouble" [JStgExpr
    h,JStgExpr
    l]

      PrimOp
    DoubleFMAdd  -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    DoubleFMSub  -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    DoubleFNMAdd -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    DoubleFNMSub -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op

    ------------------------------ Float --------------------------------------------

      PrimOp
    FloatGtOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>.   JStgExpr
    y)
      PrimOp
    FloatGeOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .>=.  JStgExpr
    y)
      PrimOp
    FloatEqOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    y)
      PrimOp
    FloatNeOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    y)
      PrimOp
    FloatLtOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<.   JStgExpr
    y)
      PrimOp
    FloatLeOp         -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    .<=.  JStgExpr
    y)
      PrimOp
    FloatAddOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    x JStgExpr
    y]
      PrimOp
    FloatSubOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    x JStgExpr
    y]
      PrimOp
    FloatMulOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [JStgExpr -> JStgExpr -> JStgExpr
    Mul JStgExpr
    x JStgExpr
    y]
      PrimOp
    FloatDivOp        -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [JStgExpr -> JStgExpr -> JStgExpr
    Div JStgExpr
    x JStgExpr
    y]
      PrimOp
    FloatNegOp        -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    Negate JStgExpr
    x
      PrimOp
    FloatFabsOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_abs [JStgExpr
    x]
      PrimOp
    FloatToIntOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    toI32 JStgExpr
    x
      PrimOp
    FloatExpOp        -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_exp [JStgExpr
    x]]
      PrimOp
    FloatExpM1Op      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_expm1 [JStgExpr
    x]]
      PrimOp
    FloatLogOp        -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_log [JStgExpr
    x]]
      PrimOp
    FloatLog1POp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_log1p [JStgExpr
    x]]
      PrimOp
    FloatSqrtOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_sqrt [JStgExpr
    x]]
      PrimOp
    FloatSinOp        -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_sin [JStgExpr
    x]]
      PrimOp
    FloatCosOp        -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_cos [JStgExpr
    x]]
      PrimOp
    FloatTanOp        -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_tan [JStgExpr
    x]]
      PrimOp
    FloatAsinOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_asin [JStgExpr
    x]]
      PrimOp
    FloatAcosOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_acos [JStgExpr
    x]]
      PrimOp
    FloatAtanOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_atan [JStgExpr
    x]]
      PrimOp
    FloatSinhOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_sinh [JStgExpr
    x]]
      PrimOp
    FloatCoshOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_cosh [JStgExpr
    x]]
      PrimOp
    FloatTanhOp       -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_tanh [JStgExpr
    x]]
      PrimOp
    FloatAsinhOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_asinh [JStgExpr
    x]]
      PrimOp
    FloatAcoshOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_acosh [JStgExpr
    x]]
      PrimOp
    FloatAtanhOp      -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_atanh [JStgExpr
    x]]
      PrimOp
    FloatPowerOp      -> \[JStgExpr
    r] [JStgExpr
    x,JStgExpr
    y] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= [JStgExpr] -> JStgExpr
    math_fround [[JStgExpr] -> JStgExpr
    math_pow [JStgExpr
    x,JStgExpr
    y]]
      PrimOp
    FloatToDoubleOp   -> \[JStgExpr
    r] [JStgExpr
    x]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    FloatDecode_IntOp -> \[JStgExpr
    s,JStgExpr
    e] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    s,JStgExpr
    e] FastString
    "h$decodeFloatInt" [JStgExpr
    x]
      PrimOp
    CastFloatToWord32Op -> \[JStgExpr
    r] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    r] FastString
    "h$castFloatToWord32" [JStgExpr
    x]
      PrimOp
    CastWord32ToFloatOp -> \[JStgExpr
    r] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    r] FastString
    "h$castWord32ToFloat" [JStgExpr
    x]

      PrimOp
    FloatFMAdd  -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    FloatFMSub  -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    FloatFNMAdd -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    FloatFNMSub -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op

    ------------------------------ Arrays -------------------------------------------

      PrimOp
    NewArrayOp           -> \[JStgExpr
    r] [JStgExpr
    l,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$newArray" [JStgExpr
    l,JStgExpr
    e]
      PrimOp
    ReadArrayOp          -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    bound JStgExpr
    a JStgExpr
    i (JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i)
      PrimOp
    WriteArrayOp         -> \[]  [JStgExpr
    a,JStgExpr
    i,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    bound JStgExpr
    a JStgExpr
    i (JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    v)
      PrimOp
    SizeofArrayOp        -> \[JStgExpr
    r] [JStgExpr
    a]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "length"
      PrimOp
    SizeofMutableArrayOp -> \[JStgExpr
    r] [JStgExpr
    a]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "length"
      PrimOp
    IndexArrayOp         -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    bound JStgExpr
    a JStgExpr
    i (JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i)
      PrimOp
    UnsafeFreezeArrayOp  -> \[JStgExpr
    r] [JStgExpr
    a]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a
      PrimOp
    UnsafeThawArrayOp    -> \[JStgExpr
    r] [JStgExpr
    a]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a
      PrimOp
    CopyArrayOp          -> \[] [JStgExpr
    a,JStgExpr
    o1,JStgExpr
    ma,JStgExpr
    o2,JStgExpr
    n] ->
        JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes)
    -> StateT JEnv Identity JStgStat -> JSM PrimRes
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$>
        (JStgExpr -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    forall t.
    (JVarMagic t, ToJExpr t) =>
    (t -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    jVar \JStgExpr
    tmp ->
          JStgStat -> StateT JEnv Identity JStgStat
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (JStgStat -> StateT JEnv Identity JStgStat)
    -> JStgStat -> StateT JEnv Identity JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    a JStgExpr
    o1 JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    ma JStgExpr
    o2 JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [ JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgStat
    |= Integer -> JStgExpr
    Int Integer
    0
                    , Bool -> JStgExpr -> JStgStat -> JStgStat
    WhileStat Bool
    False (JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    n) (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $
                      [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [ JStgExpr
    ma JStgExpr -> JStgExpr -> JStgExpr
    .! (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    tmp JStgExpr
    o2) JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    tmp JStgExpr
    o1)
                              , JStgExpr -> JStgStat
    preIncrS JStgExpr
    tmp
                              ]

                    ]
      PrimOp
    CopyMutableArrayOp  -> \[]  [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline
          (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$copyMutableArray" [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n]

      PrimOp
    CloneArrayOp        -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    start,JStgExpr
    n]     ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline
          (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    a JStgExpr
    start JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$sliceArray" [JStgExpr
    a,JStgExpr
    start,JStgExpr
    n]

      PrimOp
    CloneMutableArrayOp -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    start,JStgExpr
    n]     ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline
          (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    a JStgExpr
    start JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$sliceArray" [JStgExpr
    a,JStgExpr
    start,JStgExpr
    n]

      PrimOp
    FreezeArrayOp       -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    start,JStgExpr
    n]     ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline
          (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    a JStgExpr
    start JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$sliceArray" [JStgExpr
    a,JStgExpr
    start,JStgExpr
    n]

      PrimOp
    ThawArrayOp         -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    start,JStgExpr
    n]     ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline
          (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    a JStgExpr
    start JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$sliceArray" [JStgExpr
    a,JStgExpr
    start,JStgExpr
    n]

      PrimOp
    CasArrayOp          -> \[JStgExpr
    s,JStgExpr
    o] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    old,JStgExpr
    new] ->
        JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes)
    -> StateT JEnv Identity JStgStat -> JSM PrimRes
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$>
        (JStgExpr -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    forall t.
    (JVarMagic t, ToJExpr t) =>
    (t -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    jVar \JStgExpr
    tmp ->
          JStgStat -> StateT JEnv Identity JStgStat
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (JStgStat -> StateT JEnv Identity JStgStat)
    -> JStgStat -> StateT JEnv Identity JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    bound JStgExpr
    a JStgExpr
    i
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
              [ JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i
              , JStgExpr -> [JStgStat] -> [JStgStat] -> JStgStat
    ifBlockS (JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    old)
                         [ JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    new
                         , JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    new
                         , JStgExpr
    s JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_
                         ]
                         [ JStgExpr
    s JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    one_
                         , JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    tmp
                         ]
              ]

    ------------------------------ Small Arrays -------------------------------------

      PrimOp
    NewSmallArrayOp            -> \[JStgExpr
    a]   [JStgExpr
    n,JStgExpr
    e]         -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    a JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$newArray" [JStgExpr
    n,JStgExpr
    e]
      PrimOp
    ReadSmallArrayOp           -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i]         -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    bound JStgExpr
    a JStgExpr
    i (JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i)
      PrimOp
    WriteSmallArrayOp          -> \[]    [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    bound JStgExpr
    a JStgExpr
    i (JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    e)
      PrimOp
    SizeofSmallArrayOp         -> \[JStgExpr
    r]   [JStgExpr
    a]           -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "length"
      PrimOp
    SizeofSmallMutableArrayOp  -> \[JStgExpr
    r]   [JStgExpr
    a]           -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "length"
      PrimOp
    IndexSmallArrayOp          -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i]         -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    bound JStgExpr
    a JStgExpr
    i (JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i)
      PrimOp
    UnsafeFreezeSmallArrayOp   -> \[JStgExpr
    r]   [JStgExpr
    a]           -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a
      PrimOp
    UnsafeThawSmallArrayOp     -> \[JStgExpr
    r]   [JStgExpr
    a]           -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a
      PrimOp
    CopySmallArrayOp           -> \[]    [JStgExpr
    s,JStgExpr
    si,JStgExpr
    d,JStgExpr
    di,JStgExpr
    n] ->
        JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes)
    -> StateT JEnv Identity JStgStat -> JSM PrimRes
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$>
        (JStgExpr -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    forall t.
    (JVarMagic t, ToJExpr t) =>
    (t -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    jVar \JStgExpr
    tmp ->
          JStgStat -> StateT JEnv Identity JStgStat
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (JStgStat -> StateT JEnv Identity JStgStat)
    -> JStgStat -> StateT JEnv Identity JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    s JStgExpr
    si JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    d JStgExpr
    di JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [ JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    n JStgExpr
    one_
                    , Bool -> JStgExpr -> JStgStat -> JStgStat
    WhileStat Bool
    False (JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgExpr
    .>=. JStgExpr
    zero_)
                      (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [ JStgExpr
    d JStgExpr -> JStgExpr -> JStgExpr
    .! (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    di JStgExpr
    tmp) JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    s JStgExpr -> JStgExpr -> JStgExpr
    .! (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    si JStgExpr
    tmp)
                              , JStgExpr -> JStgStat
    postDecrS JStgExpr
    tmp
                              ]
                    ]
      PrimOp
    CopySmallMutableArrayOp    -> \[]    [JStgExpr
    s,JStgExpr
    si,JStgExpr
    d,JStgExpr
    di,JStgExpr
    n] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline
          (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    s JStgExpr
    si JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound JStgExpr
    d JStgExpr
    di JStgExpr
    n
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$copyMutableArray" [JStgExpr
    s,JStgExpr
    si,JStgExpr
    d,JStgExpr
    di,JStgExpr
    n]

      PrimOp
    CloneSmallArrayOp          -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    n]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    cloneArray Bool
    bound JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    n
      PrimOp
    CloneSmallMutableArrayOp   -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    n]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    cloneArray Bool
    bound JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    n
      PrimOp
    FreezeSmallArrayOp         -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    n]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    cloneArray Bool
    bound JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    n
      PrimOp
    ThawSmallArrayOp           -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    n]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    cloneArray Bool
    bound JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    n

      PrimOp
    CasSmallArrayOp            -> \[JStgExpr
    s,JStgExpr
    o] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    old,JStgExpr
    new] ->
        JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes)
    -> StateT JEnv Identity JStgStat -> JSM PrimRes
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$>
        (JStgExpr -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    forall t.
    (JVarMagic t, ToJExpr t) =>
    (t -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    jVar \JStgExpr
    tmp ->
          JStgStat -> StateT JEnv Identity JStgStat
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (JStgStat -> StateT JEnv Identity JStgStat)
    -> JStgStat -> StateT JEnv Identity JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    bound JStgExpr
    a JStgExpr
    i
          (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
            [ JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i
            , JStgExpr -> [JStgStat] -> [JStgStat] -> JStgStat
    ifBlockS (JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    old)
                [ JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    new
                , JStgExpr
    a JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    new
                , JStgExpr
    s JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_
                ]
                [ JStgExpr
    s JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    one_
                , JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    tmp
                ]
            ]

    ------------------------------- Byte Arrays -------------------------------------

      PrimOp
    NewByteArrayOp_Char               -> \[JStgExpr
    r]   [JStgExpr
    l]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgExpr -> JStgExpr -> JStgStat
    newByteArray JStgExpr
    r JStgExpr
    l)
      PrimOp
    NewPinnedByteArrayOp_Char         -> \[JStgExpr
    r]   [JStgExpr
    l]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgExpr -> JStgExpr -> JStgStat
    newByteArray JStgExpr
    r JStgExpr
    l)
      PrimOp
    NewAlignedPinnedByteArrayOp_Char  -> \[JStgExpr
    r]   [JStgExpr
    l,JStgExpr
    _align] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgExpr -> JStgExpr -> JStgStat
    newByteArray JStgExpr
    r JStgExpr
    l)
      PrimOp
    MutableByteArrayIsPinnedOp        -> \[JStgExpr
    r]   [JStgExpr
    _]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    one_
      PrimOp
    ByteArrayIsPinnedOp               -> \[JStgExpr
    r]   [JStgExpr
    _]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    one_
      PrimOp
    ByteArrayContents_Char            -> \[JStgExpr
    a,JStgExpr
    o] [JStgExpr
    b]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [JStgExpr
    a JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    b, JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_]
      PrimOp
    MutableByteArrayContents_Char     -> \[JStgExpr
    a,JStgExpr
    o] [JStgExpr
    b]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [JStgExpr
    a JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    b, JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_]
      PrimOp
    ShrinkMutableByteArrayOp_Char     -> \[]    [JStgExpr
    a,JStgExpr
    n]      -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$shrinkMutableByteArray" [JStgExpr
    a,JStgExpr
    n]
      PrimOp
    ResizeMutableByteArrayOp_Char     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    n]      -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$resizeMutableByteArray" [JStgExpr
    a,JStgExpr
    n]
      PrimOp
    UnsafeFreezeByteArrayOp           -> \[JStgExpr
    a]   [JStgExpr
    b]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    a JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    b
      PrimOp
    UnsafeThawByteArrayOp             -> \[JStgExpr
    a]   [JStgExpr
    b]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    a JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    b
      PrimOp
    SizeofByteArrayOp                 -> \[JStgExpr
    r]   [JStgExpr
    a]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "len"
      PrimOp
    SizeofMutableByteArrayOp          -> \[JStgExpr
    r]   [JStgExpr
    a]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "len"
      PrimOp
    GetSizeofMutableByteArrayOp       -> \[JStgExpr
    r]   [JStgExpr
    a]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "len"

      PrimOp
    IndexByteArrayOp_Char      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u8  JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_WideChar  -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Int       -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u32 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Addr      -> \[JStgExpr
    r,JStgExpr
    o] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_addr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    IndexByteArrayOp_Float     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_f32 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Double    -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_f64 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_StablePtr -> \[JStgExpr
    r,JStgExpr
    o] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_stableptr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    IndexByteArrayOp_Int8      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i8  JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Int16     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i16 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Int32     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Int64     -> \[JStgExpr
    h,JStgExpr
    l] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_i64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l
      PrimOp
    IndexByteArrayOp_Word8     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u8  JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word16    -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u16 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word32    -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u32 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word64    -> \[JStgExpr
    h,JStgExpr
    l] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_u64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l

      PrimOp
    ReadByteArrayOp_Char       -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u8  JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_WideChar   -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Int        -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word       -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u32 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Addr       -> \[JStgExpr
    r,JStgExpr
    o] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_addr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    ReadByteArrayOp_Float      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_f32 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Double     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_f64 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_StablePtr  -> \[JStgExpr
    r,JStgExpr
    o] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_stableptr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    ReadByteArrayOp_Int8       -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i8  JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Int16      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i16 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Int32      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Int64      -> \[JStgExpr
    h,JStgExpr
    l] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_i64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l
      PrimOp
    ReadByteArrayOp_Word8      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u8  JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word16     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u16 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word32     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u32 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word64     -> \[JStgExpr
    h,JStgExpr
    l] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_u64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l

      PrimOp
    WriteByteArrayOp_Char      -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u8  JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_WideChar  -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Int       -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word      -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Addr      -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    r,JStgExpr
    o] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_addr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    WriteByteArrayOp_Float     -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_f32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Double    -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_f64 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_StablePtr -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    r,JStgExpr
    o] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_stableptr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    WriteByteArrayOp_Int8      -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i8  JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Int16     -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i16 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Int32     -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Int64     -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    h,JStgExpr
    l] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l
      PrimOp
    WriteByteArrayOp_Word8     -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u8  JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word16    -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u16 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word32    -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word64    -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    h,JStgExpr
    l] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l

      PrimOp
    CompareByteArraysOp -> \[JStgExpr
    r] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n] ->
          PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes)
    -> (JStgStat -> PrimRes) -> JStgStat -> JSM PrimRes
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . JStgStat -> PrimRes
    PrimInline
          (JStgStat -> PrimRes)
    -> (JStgStat -> JStgStat) -> JStgStat -> PrimRes
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba_range Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    n
          (JStgStat -> JStgStat)
    -> (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba_range Bool
    bound JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n
          (JStgStat -> JSM PrimRes) -> JStgStat -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$compareByteArrays" [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n]

      -- We assume the arrays aren't overlapping since they're of different types
      -- (ByteArray vs MutableByteArray, Addr# vs MutableByteArray#, [Mutable]ByteArray# vs Addr#)
      PrimOp
    CopyByteArrayOp                      -> \[] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool
    -> Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> PrimRes
    copyByteArray Bool
    False Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n
      PrimOp
    CopyAddrToByteArrayOp                -> \[] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool
    -> Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> PrimRes
    copyByteArray Bool
    False Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n
      PrimOp
    CopyMutableByteArrayToAddrOp         -> \[] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool
    -> Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> PrimRes
    copyByteArray Bool
    False Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n
      PrimOp
    CopyMutableByteArrayNonOverlappingOp -> \[] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool
    -> Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> PrimRes
    copyByteArray Bool
    False Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n
      PrimOp
    CopyAddrToAddrNonOverlappingOp       -> \[] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool
    -> Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> PrimRes
    copyByteArray Bool
    False Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n
      PrimOp
    CopyByteArrayToAddrOp                -> \[] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool
    -> Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> PrimRes
    copyByteArray Bool
    False Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n

      PrimOp
    CopyMutableByteArrayOp               -> \[] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool
    -> Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> PrimRes
    copyByteArray Bool
    True  Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n
      PrimOp
    CopyAddrToAddrOp                     -> \[] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool
    -> Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> PrimRes
    copyByteArray Bool
    True  Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n

      PrimOp
    SetByteArrayOp -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    n,JStgExpr
    v] ->
        JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes)
    -> StateT JEnv Identity JStgStat -> JSM PrimRes
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> (Ident -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    forall t.
    (JVarMagic t, ToJExpr t) =>
    (t -> StateT JEnv Identity JStgStat)
    -> StateT JEnv Identity JStgStat
    jVar \Ident
    tmpIdent ->
        do
          let tmp :: JStgExpr
    tmp = FastString -> JStgExpr
    var (FastString -> JStgExpr) -> FastString -> JStgExpr
    forall a b. (a -> b) -> a -> b
    $ Ident -> FastString
    identFS Ident
    tmpIdent
          JStgStat -> StateT JEnv Identity JStgStat
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (JStgStat -> StateT JEnv Identity JStgStat)
    -> (JStgStat -> JStgStat)
    -> JStgStat
    -> StateT JEnv Identity JStgStat
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba_range Bool
    bound JStgExpr
    a JStgExpr
    o JStgExpr
    n (JStgStat -> StateT JEnv Identity JStgStat)
    -> JStgStat -> StateT JEnv Identity JStgStat
    forall a b. (a -> b) -> a -> b
    $
            [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [ Ident
    tmpIdent Ident -> JStgExpr -> JStgStat
    ||= JStgExpr
    zero_
                    , Bool -> JStgExpr -> JStgStat -> JStgStat
    WhileStat Bool
    False (JStgExpr
    tmp JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    n) (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $
                      [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u8 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    o JStgExpr
    tmp) JStgExpr
    v
                              , JStgExpr -> JStgStat
    postIncrS JStgExpr
    tmp
                              ]
                    ]
      PrimOp
    SetAddrRangeOp -> \[] xs :: [JStgExpr]
    xs@[JStgExpr
    _a,JStgExpr
    _o,JStgExpr
    _n,JStgExpr
    _v] -> Bool
    -> Bool
    -> Type
    -> PrimOp
    -> [JStgExpr]
    -> [JStgExpr]
    -> JSM PrimRes
    genPrim Bool
    prof Bool
    bound Type
    ty PrimOp
    SetByteArrayOp [] [JStgExpr]
    xs

      PrimOp
    AtomicReadByteArrayOp_Int  -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    AtomicWriteByteArrayOp_Int -> \[]    [JStgExpr
    a,JStgExpr
    i,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    v
      PrimOp
    FetchAddByteArrayOp_Int    -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpByteArray JStgExpr -> JStgExpr -> JStgExpr
    Add  JStgExpr
    r JStgExpr
    a JStgExpr
    i JStgExpr
    v
      PrimOp
    FetchSubByteArrayOp_Int    -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpByteArray JStgExpr -> JStgExpr -> JStgExpr
    Sub  JStgExpr
    r JStgExpr
    a JStgExpr
    i JStgExpr
    v
      PrimOp
    FetchAndByteArrayOp_Int    -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpByteArray JStgExpr -> JStgExpr -> JStgExpr
    BAnd JStgExpr
    r JStgExpr
    a JStgExpr
    i JStgExpr
    v
      PrimOp
    FetchOrByteArrayOp_Int     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpByteArray JStgExpr -> JStgExpr -> JStgExpr
    BOr  JStgExpr
    r JStgExpr
    a JStgExpr
    i JStgExpr
    v
      PrimOp
    FetchNandByteArrayOp_Int   -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpByteArray (\JStgExpr
    x JStgExpr
    y -> JStgExpr -> JStgExpr
    BNot (JStgExpr -> JStgExpr -> JStgExpr
    BAnd JStgExpr
    x JStgExpr
    y)) JStgExpr
    r JStgExpr
    a JStgExpr
    i JStgExpr
    v
      PrimOp
    FetchXorByteArrayOp_Int    -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpByteArray JStgExpr -> JStgExpr -> JStgExpr
    BXor JStgExpr
    r JStgExpr
    a JStgExpr
    i JStgExpr
    v

    ------------------------------- Addr# ------------------------------------------

      PrimOp
    AddrAddOp   -> \[JStgExpr
    a',JStgExpr
    o'] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i]         -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [JStgExpr
    a' JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a, JStgExpr
    o' JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    o JStgExpr
    i]
      PrimOp
    AddrSubOp   -> \[JStgExpr
    i]     [JStgExpr
    _a1,JStgExpr
    o1,JStgExpr
    _a2,JStgExpr
    o2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    o1 JStgExpr
    o2
      PrimOp
    AddrRemOp   -> \[JStgExpr
    r]     [JStgExpr
    _a,JStgExpr
    o,JStgExpr
    i]        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    Mod JStgExpr
    o JStgExpr
    i
      PrimOp
    AddrToIntOp -> \[JStgExpr
    i]     [JStgExpr
    _a,JStgExpr
    o]          -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    o -- only usable for comparisons within one range
      PrimOp
    IntToAddrOp -> \[JStgExpr
    a,JStgExpr
    o]   [JStgExpr
    i]             -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [JStgExpr
    a JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    null_, JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    i]
      PrimOp
    AddrGtOp -> \[JStgExpr
    r] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$comparePointer" [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] JStgExpr -> JStgExpr -> JStgExpr
    .>. JStgExpr
    zero_)
      PrimOp
    AddrGeOp -> \[JStgExpr
    r] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$comparePointer" [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] JStgExpr -> JStgExpr -> JStgExpr
    .>=. JStgExpr
    zero_)
      PrimOp
    AddrEqOp -> \[JStgExpr
    r] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$comparePointer" [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    zero_)
      PrimOp
    AddrNeOp -> \[JStgExpr
    r] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$comparePointer" [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] JStgExpr -> JStgExpr -> JStgExpr
    .!==. JStgExpr
    zero_)
      PrimOp
    AddrLtOp -> \[JStgExpr
    r] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$comparePointer" [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    zero_)
      PrimOp
    AddrLeOp -> \[JStgExpr
    r] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$comparePointer" [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] JStgExpr -> JStgExpr -> JStgExpr
    .<=. JStgExpr
    zero_)

    ------------------------------- Addr Indexing: Unboxed Arrays -------------------

      PrimOp
    IndexOffAddrOp_Char      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_WideChar  -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Int       -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Addr      -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_addr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    ra JStgExpr
    ro
      PrimOp
    IndexOffAddrOp_Float     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Double    -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off64 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_StablePtr -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_stableptr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    ra JStgExpr
    ro
      PrimOp
    IndexOffAddrOp_Int8      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Int16     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off16 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Int32     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Int64     -> \[JStgExpr
    h,JStgExpr
    l]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_i64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off64 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l
      PrimOp
    IndexOffAddrOp_Word8     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word16    -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off16 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word32    -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word64    -> \[JStgExpr
    h,JStgExpr
    l]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_u64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off64 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l

      PrimOp
    ReadOffAddrOp_Char       -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_WideChar   -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Int        -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word       -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Addr       -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_addr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    ra JStgExpr
    ro
      PrimOp
    ReadOffAddrOp_Float      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Double     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off64 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_StablePtr  -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_stableptr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    ra JStgExpr
    ro
      PrimOp
    ReadOffAddrOp_Int8       -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Int16      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off16 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Int32      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Int64      -> \[JStgExpr
    h,JStgExpr
    l]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_i64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off64 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l
      PrimOp
    ReadOffAddrOp_Word8      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word16     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off16 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word32     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word64     -> \[JStgExpr
    h,JStgExpr
    l]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_u64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off64 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l

      PrimOp
    WriteOffAddrOp_Char      -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_WideChar  -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Int       -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word      -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Addr      -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    va,JStgExpr
    vo] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_addr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    va JStgExpr
    vo
      PrimOp
    WriteOffAddrOp_Float     -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_f32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Double    -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_f64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off64 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_StablePtr -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    va,JStgExpr
    vo] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_stableptr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    va JStgExpr
    vo
      PrimOp
    WriteOffAddrOp_Int8      -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Int16     -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off16 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Int32     -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Int64     -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    h,JStgExpr
    l]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off64 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l
      PrimOp
    WriteOffAddrOp_Word8     -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word16    -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off16 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word32    -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off32 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word64    -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    h,JStgExpr
    l]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off64 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l

      PrimOp
    IndexOffAddrOp_Word8AsChar      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word8AsWideChar  -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word8AsInt       -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word8AsWord      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word8AsAddr      -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_addr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    ra JStgExpr
    ro
      PrimOp
    IndexOffAddrOp_Word8AsFloat     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word8AsDouble    -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word8AsStablePtr -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_stableptr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    ra JStgExpr
    ro
      PrimOp
    IndexOffAddrOp_Word8AsInt16     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word8AsInt32     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word8AsInt64     -> \[JStgExpr
    h,JStgExpr
    l]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_i64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l
      PrimOp
    IndexOffAddrOp_Word8AsWord16    -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word8AsWord32    -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    IndexOffAddrOp_Word8AsWord64    -> \[JStgExpr
    h,JStgExpr
    l]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_u64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l

      PrimOp
    ReadOffAddrOp_Word8AsChar       -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word8AsWideChar   -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word8AsInt        -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word8AsWord       -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word8AsAddr       -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_addr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    ra JStgExpr
    ro
      PrimOp
    ReadOffAddrOp_Word8AsFloat      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word8AsDouble     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word8AsStablePtr  -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_stableptr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    ra JStgExpr
    ro
      PrimOp
    ReadOffAddrOp_Word8AsInt16      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word8AsInt32      -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word8AsInt64      -> \[JStgExpr
    h,JStgExpr
    l]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_i64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l
      PrimOp
    ReadOffAddrOp_Word8AsWord16     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word8AsWord32     -> \[JStgExpr
    r]     [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i)
      PrimOp
    ReadOffAddrOp_Word8AsWord64     -> \[JStgExpr
    h,JStgExpr
    l]   [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_u64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l

      PrimOp
    WriteOffAddrOp_Word8AsChar      -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u8  JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8  JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word8AsWideChar  -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word8AsInt       -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word8AsWord      -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word8AsAddr      -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    va,JStgExpr
    vo] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_addr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    va JStgExpr
    vo
      PrimOp
    WriteOffAddrOp_Word8AsFloat     -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_f32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word8AsDouble    -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_f64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word8AsStablePtr -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    va,JStgExpr
    vo] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_stableptr JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    va JStgExpr
    vo
      PrimOp
    WriteOffAddrOp_Word8AsInt16     -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word8AsInt32     -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word8AsInt64     -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    h,JStgExpr
    l]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l
      PrimOp
    WriteOffAddrOp_Word8AsWord16    -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u16 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word8AsWord32    -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    v]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    v
      PrimOp
    WriteOffAddrOp_Word8AsWord64    -> \[] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    i,JStgExpr
    h,JStgExpr
    l]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u64 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    off8 JStgExpr
    o JStgExpr
    i) JStgExpr
    h JStgExpr
    l

    ------------------------------- Mutable variables --------------------------------------
      PrimOp
    NewMutVarOp           -> \[JStgExpr
    r] [JStgExpr
    x]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    New (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$MutVar" [JStgExpr
    x])
      PrimOp
    ReadMutVarOp          -> \[JStgExpr
    r] [JStgExpr
    m]       -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    m JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "val"
      PrimOp
    WriteMutVarOp         -> \[] [JStgExpr
    m,JStgExpr
    x]      -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    m JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "val" JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    x
      PrimOp
    AtomicModifyMutVar2Op -> \[JStgExpr
    r1,JStgExpr
    r2] [JStgExpr
    m,JStgExpr
    f] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    r1,JStgExpr
    r2] FastString
    "h$atomicModifyMutVar2" [JStgExpr
    m,JStgExpr
    f]
      PrimOp
    AtomicModifyMutVar_Op -> \[JStgExpr
    r1,JStgExpr
    r2] [JStgExpr
    m,JStgExpr
    f] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    r1,JStgExpr
    r2] FastString
    "h$atomicModifyMutVar" [JStgExpr
    m,JStgExpr
    f]

      PrimOp
    AtomicSwapMutVarOp    -> \[JStgExpr
    r] [JStgExpr
    mv,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                                              [ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    mv JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "val", JStgExpr
    mv JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "val" JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    v ]
      PrimOp
    CasMutVarOp -> \[JStgExpr
    status,JStgExpr
    r] [JStgExpr
    mv,JStgExpr
    o,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (JStgExpr
    mv JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "val" JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    o)
                       ([JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [JStgExpr
    status JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_, JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    n, JStgExpr
    mv JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "val" JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    n])
                       ([JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat [JStgExpr
    status JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    one_ , JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    mv JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "val"])

    ------------------------------- Exceptions --------------------------------------

      PrimOp
    CatchOp -> \[JStgExpr
    _r] [JStgExpr
    a,JStgExpr
    handler] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$catch" [JStgExpr
    a, JStgExpr
    handler])

                                 -- fully ignore the result arity as it can use 1 or 2
                                 -- slots, depending on the return type.
      PrimOp
    RaiseOp                 -> \[JStgExpr]
    _r [JStgExpr
    a] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$throw" [JStgExpr
    a, JStgExpr
    false_])
      PrimOp
    RaiseIOOp               -> \[JStgExpr]
    _r [JStgExpr
    a] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$throw" [JStgExpr
    a, JStgExpr
    false_])
      PrimOp
    RaiseUnderflowOp        -> \[JStgExpr]
    _r []  -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$throw" [FastString -> JStgExpr
    var FastString
    "h$ghczminternalZCGHCziInternalziExceptionziTypeziunderflowException", JStgExpr
    false_])
      PrimOp
    RaiseOverflowOp         -> \[JStgExpr]
    _r []  -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$throw" [FastString -> JStgExpr
    var FastString
    "h$ghczminternalZCGHCziInternalziExceptionziTypezioverflowException", JStgExpr
    false_])
      PrimOp
    RaiseDivZeroOp          -> \[JStgExpr]
    _r []  -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$throw" [FastString -> JStgExpr
    var FastString
    "h$ghczminternalZCGHCziInternalziExceptionziTypezidivZZeroException", JStgExpr
    false_])
      PrimOp
    MaskAsyncExceptionsOp   -> \[JStgExpr]
    _r [JStgExpr
    a] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$maskAsync" [JStgExpr
    a])
      PrimOp
    MaskUninterruptibleOp   -> \[JStgExpr]
    _r [JStgExpr
    a] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$maskUnintAsync" [JStgExpr
    a])
      PrimOp
    UnmaskAsyncExceptionsOp -> \[JStgExpr]
    _r [JStgExpr
    a] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$unmaskAsync" [JStgExpr
    a])

      PrimOp
    MaskStatus -> \[JStgExpr
    r] [] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$maskStatus" []

    ------------------------------- STM-accessible Mutable Variables  --------------

      PrimOp
    AtomicallyOp -> \[JStgExpr
    _r] [JStgExpr
    a]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$atomically" [JStgExpr
    a])
      PrimOp
    RetryOp      -> \[JStgExpr]
    _r   []    -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$stmRetry" [])
      PrimOp
    CatchRetryOp -> \[JStgExpr
    _r] [JStgExpr
    a,JStgExpr
    b] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$stmCatchRetry" [JStgExpr
    a,JStgExpr
    b])
      PrimOp
    CatchSTMOp   -> \[JStgExpr
    _r] [JStgExpr
    a,JStgExpr
    h] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$catchStm" [JStgExpr
    a,JStgExpr
    h])
      PrimOp
    NewTVarOp    -> \[JStgExpr
    tv] [JStgExpr
    v]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    tv JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$newTVar" [JStgExpr
    v]
      PrimOp
    ReadTVarOp   -> \[JStgExpr
    r] [JStgExpr
    tv]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$readTVar" [JStgExpr
    tv]
      PrimOp
    ReadTVarIOOp -> \[JStgExpr
    r] [JStgExpr
    tv]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$readTVarIO" [JStgExpr
    tv]
      PrimOp
    WriteTVarOp  -> \[] [JStgExpr
    tv,JStgExpr
    v]  -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$writeTVar" [JStgExpr
    tv,JStgExpr
    v]

    ------------------------------- Synchronized Mutable Variables ------------------

      PrimOp
    NewMVarOp     -> \[JStgExpr
    r]   []    -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    New (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$MVar" [])
      PrimOp
    TakeMVarOp    -> \[JStgExpr
    _r]  [JStgExpr
    m]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$takeMVar" [JStgExpr
    m])
      PrimOp
    TryTakeMVarOp -> \[JStgExpr
    r,JStgExpr
    v] [JStgExpr
    m]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    r,JStgExpr
    v] FastString
    "h$tryTakeMVar" [JStgExpr
    m]
      PrimOp
    PutMVarOp     -> \[]    [JStgExpr
    m,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$putMVar" [JStgExpr
    m,JStgExpr
    v])
      PrimOp
    TryPutMVarOp  -> \[JStgExpr
    r]   [JStgExpr
    m,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$tryPutMVar" [JStgExpr
    m,JStgExpr
    v]
      PrimOp
    ReadMVarOp    -> \[JStgExpr
    _r]  [JStgExpr
    m]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$readMVar" [JStgExpr
    m])
      PrimOp
    TryReadMVarOp -> \[JStgExpr
    r,JStgExpr
    v] [JStgExpr
    m]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                                       [ JStgExpr
    v JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    m JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "val"
                                       , JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if01 (JStgExpr
    v JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    null_)
                                       ]
      PrimOp
    IsEmptyMVarOp -> \[JStgExpr
    r]   [JStgExpr
    m]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    m JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "val" JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    null_)

    ------------------------------- Delay/Wait Ops ---------------------------------

      PrimOp
    DelayOp     -> \[] [JStgExpr
    t]  -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$delayThread" [JStgExpr
    t])
      PrimOp
    WaitReadOp  -> \[] [JStgExpr
    fd] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$waidRead" [JStgExpr
    fd])
      PrimOp
    WaitWriteOp -> \[] [JStgExpr
    fd] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$waitWrite" [JStgExpr
    fd])

    ------------------------------- Concurrency Primitives -------------------------

      PrimOp
    ForkOp                 -> \[JStgExpr
    _tid] [JStgExpr
    x]    -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$fork" [JStgExpr
    x, JStgExpr
    true_])
      PrimOp
    ForkOnOp               -> \[JStgExpr
    _tid] [JStgExpr
    _p,JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$fork" [JStgExpr
    x, JStgExpr
    true_]) -- ignore processor argument
      PrimOp
    KillThreadOp           -> \[] [JStgExpr
    tid,JStgExpr
    ex]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$killThread" [JStgExpr
    tid,JStgExpr
    ex])
      PrimOp
    YieldOp                -> \[] []         -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$yield" [])
      PrimOp
    MyThreadIdOp           -> \[JStgExpr
    r] []        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> JStgExpr
    var FastString
    "h$currentThread"
      PrimOp
    IsCurrentThreadBoundOp -> \[JStgExpr
    r] []        -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    one_
      PrimOp
    NoDuplicateOp          -> \[] []         -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline JStgStat
    forall a. Monoid a => a
    mempty -- don't need to do anything as long as we have eager blackholing
      PrimOp
    ThreadStatusOp         -> \[JStgExpr
    stat,JStgExpr
    cap,JStgExpr
    locked] [JStgExpr
    tid] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    stat, JStgExpr
    cap, JStgExpr
    locked] FastString
    "h$threadStatus" [JStgExpr
    tid]
      PrimOp
    ListThreadsOp          -> \[JStgExpr
    r] [] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    r] FastString
    "h$listThreads" []
      PrimOp
    GetThreadLabelOp       -> \[JStgExpr
    r1, JStgExpr
    r2] [JStgExpr
    t]  -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    r1, JStgExpr
    r2] FastString
    "h$getThreadLabel" [JStgExpr
    t]
      PrimOp
    LabelThreadOp          -> \[] [JStgExpr
    t,JStgExpr
    l]      -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    t JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "label" JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    l

    ------------------------------- Weak Pointers -----------------------------------

      PrimOp
    MkWeakOp              -> \[JStgExpr
    r] [JStgExpr
    o,JStgExpr
    b,JStgExpr
    c] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$makeWeak" [JStgExpr
    o,JStgExpr
    b,JStgExpr
    c]
      PrimOp
    MkWeakNoFinalizerOp   -> \[JStgExpr
    r] [JStgExpr
    o,JStgExpr
    b]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$makeWeakNoFinalizer" [JStgExpr
    o,JStgExpr
    b]
      PrimOp
    AddCFinalizerToWeakOp -> \[JStgExpr
    r] [JStgExpr
    _a1,JStgExpr
    _a1o,JStgExpr
    _a2,JStgExpr
    _a2o,JStgExpr
    _i,JStgExpr
    _a3,JStgExpr
    _a3o,JStgExpr
    _w] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    one_
      PrimOp
    DeRefWeakOp           -> \[JStgExpr
    f,JStgExpr
    v] [JStgExpr
    w] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                                             [ JStgExpr
    v JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    w JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "val"
                                             , JStgExpr
    f JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if01 (JStgExpr
    v JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    null_)
                                             ]
      PrimOp
    FinalizeWeakOp     -> \[JStgExpr
    fl,JStgExpr
    fin] [JStgExpr
    w] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    fin, JStgExpr
    fl] FastString
    "h$finalizeWeak" [JStgExpr
    w]
      PrimOp
    TouchOp            -> \[] [JStgExpr
    _e]      -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline JStgStat
    forall a. Monoid a => a
    mempty
      PrimOp
    KeepAliveOp        -> \[JStgExpr
    _r] [JStgExpr
    x, JStgExpr
    f]  -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    ReturnStat (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$keepAlive" [JStgExpr
    x, JStgExpr
    f])

    ------------------------------ Stable pointers and names ------------------------

      PrimOp
    MakeStablePtrOp -> \[JStgExpr
    s1,JStgExpr
    s2] [JStgExpr
    a] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
          [ JStgExpr
    s1 JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> JStgExpr
    var FastString
    "h$stablePtrBuf"
          , JStgExpr
    s2 JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$makeStablePtr" [JStgExpr
    a]
          ]
      PrimOp
    DeRefStablePtrOp -> \[JStgExpr
    r] [JStgExpr
    _s1,JStgExpr
    s2]            -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$deRefStablePtr" [JStgExpr
    s2]
      PrimOp
    EqStablePtrOp    -> \[JStgExpr
    r] [JStgExpr
    _sa1,JStgExpr
    sa2,JStgExpr
    _sb1,JStgExpr
    sb2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    sa2 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    sb2)

      PrimOp
    MakeStableNameOp  -> \[JStgExpr
    r] [JStgExpr
    a] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$makeStableName" [JStgExpr
    a]
      PrimOp
    StableNameToIntOp -> \[JStgExpr
    r] [JStgExpr
    s] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$stableNameInt" [JStgExpr
    s]

    ------------------------------ Compact normal form -----------------------------

      PrimOp
    CompactNewOp           -> \[JStgExpr
    c] [JStgExpr
    s]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    c JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$compactNew" [JStgExpr
    s]
      PrimOp
    CompactResizeOp        -> \[]  [JStgExpr
    c,JStgExpr
    s] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$compactResize" [JStgExpr
    c,JStgExpr
    s]
      PrimOp
    CompactContainsOp      -> \[JStgExpr
    r] [JStgExpr
    c,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$compactContains" [JStgExpr
    c,JStgExpr
    v]
      PrimOp
    CompactContainsAnyOp   -> \[JStgExpr
    r] [JStgExpr
    v]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$compactContainsAny" [JStgExpr
    v]
      PrimOp
    CompactGetFirstBlockOp -> \[JStgExpr
    ra,JStgExpr
    ro,JStgExpr
    s] [JStgExpr
    c] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    ra,JStgExpr
    ro,JStgExpr
    s] FastString
    "h$compactGetFirstBlock" [JStgExpr
    c]
      PrimOp
    CompactGetNextBlockOp -> \[JStgExpr
    ra,JStgExpr
    ro,JStgExpr
    s] [JStgExpr
    c,JStgExpr
    a,JStgExpr
    o] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    ra,JStgExpr
    ro,JStgExpr
    s] FastString
    "h$compactGetNextBlock" [JStgExpr
    c,JStgExpr
    a,JStgExpr
    o]
      PrimOp
    CompactAllocateBlockOp -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    size,JStgExpr
    sa,JStgExpr
    so] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    ra,JStgExpr
    ro] FastString
    "h$compactAllocateBlock" [JStgExpr
    size,JStgExpr
    sa,JStgExpr
    so]
      PrimOp
    CompactFixupPointersOp -> \[JStgExpr
    c,JStgExpr
    newroota, JStgExpr
    newrooto] [JStgExpr
    blocka,JStgExpr
    blocko,JStgExpr
    roota,JStgExpr
    rooto] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT [JStgExpr
    c,JStgExpr
    newroota,JStgExpr
    newrooto] FastString
    "h$compactFixupPointers" [JStgExpr
    blocka,JStgExpr
    blocko,JStgExpr
    roota,JStgExpr
    rooto]
      PrimOp
    CompactAdd -> \[JStgExpr
    _r] [JStgExpr
    c,JStgExpr
    o] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$compactAdd" [JStgExpr
    c,JStgExpr
    o])
      PrimOp
    CompactAddWithSharing -> \[JStgExpr
    _r] [JStgExpr
    c,JStgExpr
    o] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$compactAddWithSharing" [JStgExpr
    c,JStgExpr
    o])
      PrimOp
    CompactSize -> \[JStgExpr
    s] [JStgExpr
    c] ->
        PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    s JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$compactSize" [JStgExpr
    c]

    ------------------------------ Unsafe pointer equality --------------------------

      PrimOp
    ReallyUnsafePtrEqualityOp -> \[JStgExpr
    r] [JStgExpr
    p1,JStgExpr
    p2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr
    if10 (JStgExpr
    p1 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    p2)

    ------------------------------ Parallelism --------------------------------------

      PrimOp
    ParOp     -> \[JStgExpr
    r] [JStgExpr
    _a] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_
      PrimOp
    SparkOp   -> \[JStgExpr
    r] [JStgExpr
    a]  -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a
      PrimOp
    SeqOp     -> \[JStgExpr
    _r] [JStgExpr
    e] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$e" [JStgExpr
    e])
      PrimOp
    NumSparks -> \[JStgExpr
    r] []   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_

    ------------------------------ Tag to enum stuff --------------------------------

      PrimOp
    DataToTagSmallOp -> \[JStgExpr
    _r] [JStgExpr
    d] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
          [ JStgExpr
    stack JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr -> JStgExpr
    PreInc JStgExpr
    sp JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> JStgExpr
    var FastString
    "h$dataToTag_e"
          , JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$e" [JStgExpr
    d])
          ]
      PrimOp
    DataToTagLargeOp -> \[JStgExpr
    _r] [JStgExpr
    d] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
          [ JStgExpr
    stack JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr -> JStgExpr
    PreInc JStgExpr
    sp JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> JStgExpr
    var FastString
    "h$dataToTag_e"
          , JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$e" [JStgExpr
    d])
          ]
      PrimOp
    TagToEnumOp -> \[JStgExpr
    r] [JStgExpr
    tag] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $
        if Type -> Bool
    isBoolTy Type
    ty
        then JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr
    IfExpr JStgExpr
    tag JStgExpr
    true_ JStgExpr
    false_
        else JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$tagToEnum" [JStgExpr
    tag]

    ------------------------------ Bytecode operations ------------------------------

      PrimOp
    AddrToAnyOp -> \[JStgExpr
    r] [JStgExpr
    d,JStgExpr
    _o] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    d

    ------------------------------ Profiling (CCS)  ------------------------------

      PrimOp
    GetCCSOfOp -> \[JStgExpr
    a, JStgExpr
    o] [JStgExpr
    obj] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
        if Bool
    prof
        then [ JStgExpr
    a JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr
    if_ (JStgExpr -> JStgExpr
    isObject JStgExpr
    obj)
               (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$buildCCSPtr" [JStgExpr
    obj JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "cc"])
               JStgExpr
    null_
             , JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_
             ]
        else [ JStgExpr
    a JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    null_
             , JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_
             ]

      PrimOp
    GetCurrentCCSOp -> \[JStgExpr
    a, JStgExpr
    o] [JStgExpr
    _dummy_arg] ->
        let ptr :: JStgExpr
    ptr = if Bool
    prof then FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$buildCCSPtr" [JStgExpr
    jCurrentCCS]
                          else JStgExpr
    null_
        in PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
            [ JStgExpr
    a JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    ptr
            , JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_
            ]

      PrimOp
    ClearCCSOp -> \[JStgExpr
    _r] [JStgExpr
    x] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PRPrimCall (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgStat
    ReturnStat (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$clearCCS" [JStgExpr
    x])

    ------------------------------ Eventlog -------------------

      PrimOp
    TraceEventOp       -> \[] [JStgExpr
    ed,JStgExpr
    eo]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$traceEvent" [JStgExpr
    ed,JStgExpr
    eo]
      PrimOp
    TraceEventBinaryOp -> \[] [JStgExpr
    ed,JStgExpr
    eo,JStgExpr
    len] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$traceEventBinary" [JStgExpr
    ed,JStgExpr
    eo,JStgExpr
    len]
      PrimOp
    TraceMarkerOp      -> \[] [JStgExpr
    ed,JStgExpr
    eo]     -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$traceMarker" [JStgExpr
    ed,JStgExpr
    eo]

    ------------------------------ ByteArray -------------------

      PrimOp
    IndexByteArrayOp_Word8AsChar      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u8  JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word8AsWideChar  -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word8AsAddr      -> \[JStgExpr
    r,JStgExpr
    o] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_addr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    IndexByteArrayOp_Word8AsFloat     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f32 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word8AsDouble    -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f64 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word8AsStablePtr -> \[JStgExpr
    r,JStgExpr
    o] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_stableptr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    IndexByteArrayOp_Word8AsInt16     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i16 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word8AsInt32     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word8AsInt64     -> \[JStgExpr
    h,JStgExpr
    l] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_i64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l
      PrimOp
    IndexByteArrayOp_Word8AsInt       -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32  JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word8AsWord16    -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u16  JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word8AsWord32    -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32  JStgExpr
    a JStgExpr
    i
      PrimOp
    IndexByteArrayOp_Word8AsWord64    -> \[JStgExpr
    h,JStgExpr
    l] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_u64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l
      PrimOp
    IndexByteArrayOp_Word8AsWord      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32  JStgExpr
    a JStgExpr
    i

      PrimOp
    ReadByteArrayOp_Word8AsChar       -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u8  JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word8AsWideChar   -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word8AsAddr       -> \[JStgExpr
    r,JStgExpr
    o] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_addr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    ReadByteArrayOp_Word8AsFloat      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f32 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word8AsDouble     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f64 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word8AsStablePtr  -> \[JStgExpr
    r,JStgExpr
    o] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_stableptr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    ReadByteArrayOp_Word8AsInt16      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i16 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word8AsInt32      -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word8AsInt64      -> \[JStgExpr
    h,JStgExpr
    l] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_i64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l
      PrimOp
    ReadByteArrayOp_Word8AsInt        -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32  JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word8AsWord16     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u16  JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word8AsWord32     -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32  JStgExpr
    a JStgExpr
    i
      PrimOp
    ReadByteArrayOp_Word8AsWord64     -> \[JStgExpr
    h,JStgExpr
    l] [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_u64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l
      PrimOp
    ReadByteArrayOp_Word8AsWord       -> \[JStgExpr
    r]   [JStgExpr
    a,JStgExpr
    i] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32  JStgExpr
    a JStgExpr
    i

      PrimOp
    WriteByteArrayOp_Word8AsChar      -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i8  JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word8AsWideChar  -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word8AsAddr      -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    r,JStgExpr
    o] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_addr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o
      PrimOp
    WriteByteArrayOp_Word8AsFloat     -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_f32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word8AsDouble    -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_f64 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word8AsStablePtr -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    _,JStgExpr
    o] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    o
      PrimOp
    WriteByteArrayOp_Word8AsInt16     -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i16 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word8AsInt32     -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word8AsInt64     -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    h,JStgExpr
    l] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l
      PrimOp
    WriteByteArrayOp_Word8AsInt       -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word8AsWord16    -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u16 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word8AsWord32    -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a JStgExpr
    i JStgExpr
    e
      PrimOp
    WriteByteArrayOp_Word8AsWord64    -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    h,JStgExpr
    l] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l
      PrimOp
    WriteByteArrayOp_Word8AsWord      -> \[] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    e]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a JStgExpr
    i JStgExpr
    e

      PrimOp
    CasByteArrayOp_Int                -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    o,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    casOp JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    r JStgExpr
    a JStgExpr
    i JStgExpr
    o JStgExpr
    n
      PrimOp
    CasByteArrayOp_Int8               -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    o,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8  Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    casOp JStgExpr -> JStgExpr -> JStgExpr
    read_i8  JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i8  JStgExpr
    r JStgExpr
    a JStgExpr
    i JStgExpr
    o JStgExpr
    n
      PrimOp
    CasByteArrayOp_Int16              -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    o,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix16 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    casOp JStgExpr -> JStgExpr -> JStgExpr
    read_i16 JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i16 JStgExpr
    r JStgExpr
    a JStgExpr
    i JStgExpr
    o JStgExpr
    n
      PrimOp
    CasByteArrayOp_Int32              -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    o,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    casOp JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    r JStgExpr
    a JStgExpr
    i JStgExpr
    o JStgExpr
    n

      PrimOp
    CasByteArrayOp_Int64              -> \[JStgExpr
    rh,JStgExpr
    rl] [JStgExpr
    a,JStgExpr
    i,JStgExpr
    oh,JStgExpr
    ol,JStgExpr
    nh,JStgExpr
    nl] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    bound JStgExpr
    a JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> (JStgExpr, JStgExpr)
    -> JStgExpr
    -> JStgExpr
    -> (JStgExpr, JStgExpr)
    -> (JStgExpr, JStgExpr)
    -> JStgStat
    casOp2 JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_i64 JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i64 (JStgExpr
    rh,JStgExpr
    rl) JStgExpr
    a JStgExpr
    i (JStgExpr
    oh,JStgExpr
    ol) (JStgExpr
    nh,JStgExpr
    nl)

      PrimOp
    CasAddrOp_Addr                    -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    oa,JStgExpr
    oo,JStgExpr
    na,JStgExpr
    no] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> (JStgExpr, JStgExpr)
    -> JStgExpr
    -> JStgExpr
    -> (JStgExpr, JStgExpr)
    -> (JStgExpr, JStgExpr)
    -> JStgStat
    casOp2 JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_addr JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_addr (JStgExpr
    ra,JStgExpr
    ro) JStgExpr
    a JStgExpr
    o (JStgExpr
    oa,JStgExpr
    oo) (JStgExpr
    na,JStgExpr
    no)
      PrimOp
    CasAddrOp_Word                    -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    old,JStgExpr
    new] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    casOp JStgExpr -> JStgExpr -> JStgExpr
    read_u32 JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u32 JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    old JStgExpr
    new
      PrimOp
    CasAddrOp_Word8                   -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    old,JStgExpr
    new] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    casOp JStgExpr -> JStgExpr -> JStgExpr
    read_u8  JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u8  JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    old JStgExpr
    new
      PrimOp
    CasAddrOp_Word16                  -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    old,JStgExpr
    new] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    casOp JStgExpr -> JStgExpr -> JStgExpr
    read_u16 JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u16 JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    old JStgExpr
    new
      PrimOp
    CasAddrOp_Word32                  -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    old,JStgExpr
    new] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    casOp JStgExpr -> JStgExpr -> JStgExpr
    read_u32 JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u32 JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    old JStgExpr
    new
      PrimOp
    CasAddrOp_Word64                  -> \[JStgExpr
    rh,JStgExpr
    rl] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    oh,JStgExpr
    ol,JStgExpr
    nh,JStgExpr
    nl] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> (JStgExpr, JStgExpr)
    -> JStgExpr
    -> JStgExpr
    -> (JStgExpr, JStgExpr)
    -> (JStgExpr, JStgExpr)
    -> JStgStat
    casOp2 JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_u64 JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u64 (JStgExpr
    rh,JStgExpr
    rl) JStgExpr
    a JStgExpr
    o (JStgExpr
    oh,JStgExpr
    ol) (JStgExpr
    nh,JStgExpr
    nl)

      PrimOp
    FetchAddAddrOp_Word               -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpAddr JStgExpr -> JStgExpr -> JStgExpr
    Add   JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    v
      PrimOp
    FetchSubAddrOp_Word               -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpAddr JStgExpr -> JStgExpr -> JStgExpr
    Sub   JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    v
      PrimOp
    FetchAndAddrOp_Word               -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpAddr JStgExpr -> JStgExpr -> JStgExpr
    BAnd  JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    v
      PrimOp
    FetchNandAddrOp_Word              -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpAddr ((JStgExpr -> JStgExpr
    BNot (JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr) -> JStgExpr -> JStgExpr
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    .) ((JStgExpr -> JStgExpr) -> JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . JStgExpr -> JStgExpr -> JStgExpr
    BAnd) JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    v
      PrimOp
    FetchOrAddrOp_Word                -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpAddr JStgExpr -> JStgExpr -> JStgExpr
    BOr   JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    v
      PrimOp
    FetchXorAddrOp_Word               -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    v] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpAddr JStgExpr -> JStgExpr -> JStgExpr
    BXor  JStgExpr
    r JStgExpr
    a JStgExpr
    o JStgExpr
    v

      PrimOp
    InterlockedExchange_Addr          -> \[JStgExpr
    ra,JStgExpr
    ro] [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                                              [ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_addr JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    ra JStgExpr
    ro
                                              , JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_addr JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2
                                              ]
      PrimOp
    InterlockedExchange_Word          -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o,JStgExpr
    w] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
                                              [ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a JStgExpr
    o
                                              , JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a JStgExpr
    o JStgExpr
    w
                                              ]

      PrimOp
    ShrinkSmallMutableArrayOp_Char    -> \[]  [JStgExpr
    a,JStgExpr
    n] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$shrinkMutableCharArray" [JStgExpr
    a,JStgExpr
    n]
      PrimOp
    GetSizeofSmallMutableArrayOp      -> \[JStgExpr
    r] [JStgExpr
    a]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "length"

      PrimOp
    AtomicReadAddrOp_Word             -> \[JStgExpr
    r] [JStgExpr
    a,JStgExpr
    o]   -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a JStgExpr
    o
      PrimOp
    AtomicWriteAddrOp_Word            -> \[]  [JStgExpr
    a,JStgExpr
    o,JStgExpr
    w] -> PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a JStgExpr
    o JStgExpr
    w

    ------------------------------ Unhandled primops -------------------

      PrimOp
    NewPromptTagOp                    -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    PromptOp                          -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    Control0Op                        -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op

      PrimOp
    NewIOPortOp                       -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    ReadIOPortOp                      -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    WriteIOPortOp                     -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op

      PrimOp
    GetSparkOp                        -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    AnyToAddrOp                       -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    MkApUpd0_Op                       -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    NewBCOOp                          -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    UnpackClosureOp                   -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    ClosureSizeOp                     -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    GetApStackValOp                   -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      PrimOp
    WhereFromOp                       -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op -- should be easily implementable with o.f.n

      PrimOp
    SetThreadAllocationCounter        -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op

    ------------------------------- Vector -----------------------------------------
    -- For now, vectors are unsupported on the JS backend. Simply put, they do not
    -- make much sense to support given support for arrays and lack of SIMD support
    -- in JS. We could try to roll something special but we would not be able to
    -- give any performance guarentees to the user and so we leave these has
    -- unhandled for now.
      VecBroadcastOp PrimOpVecCat
    _ Int
    _ Width
    _              -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecPackOp PrimOpVecCat
    _ Int
    _ Width
    _                   -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecUnpackOp PrimOpVecCat
    _ Int
    _ Width
    _                 -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecInsertOp PrimOpVecCat
    _ Int
    _ Width
    _                 -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecAddOp PrimOpVecCat
    _ Int
    _ Width
    _                    -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecSubOp PrimOpVecCat
    _ Int
    _ Width
    _                    -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecMulOp PrimOpVecCat
    _ Int
    _ Width
    _                    -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecDivOp PrimOpVecCat
    _ Int
    _ Width
    _                    -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecQuotOp PrimOpVecCat
    _ Int
    _ Width
    _                   -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecRemOp PrimOpVecCat
    _ Int
    _ Width
    _                    -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecNegOp PrimOpVecCat
    _ Int
    _ Width
    _                    -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecIndexByteArrayOp PrimOpVecCat
    _ Int
    _ Width
    _         -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecReadByteArrayOp PrimOpVecCat
    _ Int
    _ Width
    _          -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecWriteByteArrayOp PrimOpVecCat
    _ Int
    _ Width
    _         -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecIndexOffAddrOp PrimOpVecCat
    _ Int
    _ Width
    _           -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecReadOffAddrOp PrimOpVecCat
    _ Int
    _ Width
    _            -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecWriteOffAddrOp PrimOpVecCat
    _ Int
    _ Width
    _           -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op

      VecIndexScalarByteArrayOp PrimOpVecCat
    _ Int
    _ Width
    _   -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecReadScalarByteArrayOp PrimOpVecCat
    _ Int
    _ Width
    _    -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecWriteScalarByteArrayOp PrimOpVecCat
    _ Int
    _ Width
    _   -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecIndexScalarOffAddrOp PrimOpVecCat
    _ Int
    _ Width
    _     -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecReadScalarOffAddrOp PrimOpVecCat
    _ Int
    _ Width
    _      -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op
      VecWriteScalarOffAddrOp PrimOpVecCat
    _ Int
    _ Width
    _     -> PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op

      PrimOp
    PrefetchByteArrayOp3              -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchMutableByteArrayOp3       -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchAddrOp3                   -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchValueOp3                  -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchByteArrayOp2              -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchMutableByteArrayOp2       -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchAddrOp2                   -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchValueOp2                  -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchByteArrayOp1              -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchMutableByteArrayOp1       -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchAddrOp1                   -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchValueOp1                  -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchByteArrayOp0              -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchMutableByteArrayOp0       -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchAddrOp0                   -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp
      PrimOp
    PrefetchValueOp0                  -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp

    unhandledPrimop :: PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop :: PrimOp -> [JStgExpr] -> [JStgExpr] -> JSM PrimRes
    unhandledPrimop PrimOp
    op [JStgExpr]
    rs [JStgExpr]
    as = PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> JSM PrimRes) -> PrimRes -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$log" ([JStgExpr] -> JStgStat) -> [JStgExpr] -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ JStgExpr -> [JStgExpr]
    forall a. a -> [a]
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (JStgExpr -> [JStgExpr]) -> JStgExpr -> [JStgExpr]
    forall a b. (a -> b) -> a -> b
    $ FastString -> JStgExpr
    String (FastString -> JStgExpr) -> FastString -> JStgExpr
    forall a b. (a -> b) -> a -> b
    $
        String -> FastString
    fsLit (String -> FastString) -> String -> FastString
    forall a b. (a -> b) -> a -> b
    $ [String] -> String
    forall a. Monoid a => [a] -> a
    mconcat
               [ String
    "warning, unhandled primop: "
               , SDocContext -> SDoc -> String
    renderWithContext SDocContext
    defaultSDocContext (PrimOp -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr PrimOp
    op)
               , String
    " "
               , (Int, Int) -> String
    forall a. Show a => a -> String
    show ([JStgExpr] -> Int
    forall a. [a] -> Int
    forall (t :: * -> *) a. Foldable t => t a -> Int
    length [JStgExpr]
    rs, [JStgExpr] -> Int
    forall a. [a] -> Int
    forall (t :: * -> *) a. Foldable t => t a -> Int
    length [JStgExpr]
    as)
               ]
      , FastString -> [JStgExpr] -> JStgStat
    appS (String -> FastString
    mkFastString (String -> FastString) -> String -> FastString
    forall a b. (a -> b) -> a -> b
    $ String
    "h$primop_" String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String -> String
    zEncodeString (SDocContext -> SDoc -> String
    renderWithContext SDocContext
    defaultSDocContext (PrimOp -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr PrimOp
    op))) [JStgExpr]
    as
        -- copyRes
      , [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat ([JStgStat] -> JStgStat) -> [JStgStat] -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ (JStgExpr -> StgRet -> JStgStat)
    -> [JStgExpr] -> [StgRet] -> [JStgStat]
    forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
    zipWith (\JStgExpr
    r StgRet
    reg -> JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= (StgRet -> JStgExpr
    foreignRegister StgRet
    reg)) [JStgExpr]
    rs (StgRet -> [StgRet]
    forall a. Enum a => a -> [a]
    enumFrom StgRet
    Ret1)
      ]

    -- | A No Op, used for primops the JS platform cannot or do not support. For
    -- example, the prefetching primops do not make sense on the JS platform because
    -- we do not have enough control over memory to provide any kind of prefetching
    -- mechanism. Hence, these are NoOps.
    noOp :: Foldable f => f a -> f a -> JSM PrimRes
    noOp :: forall (f :: * -> *) a. Foldable f => f a -> f a -> JSM PrimRes
    noOp = (f a -> JSM PrimRes) -> f a -> f a -> JSM PrimRes
    forall a b. a -> b -> a
    const ((f a -> JSM PrimRes) -> f a -> f a -> JSM PrimRes)
    -> (PrimRes -> f a -> JSM PrimRes)
    -> PrimRes
    -> f a
    -> f a
    -> JSM PrimRes
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . JSM PrimRes -> f a -> JSM PrimRes
    forall a b. a -> b -> a
    const (JSM PrimRes -> f a -> JSM PrimRes)
    -> (PrimRes -> JSM PrimRes) -> PrimRes -> f a -> JSM PrimRes
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . PrimRes -> JSM PrimRes
    forall a. a -> StateT JEnv Identity a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (PrimRes -> f a -> f a -> JSM PrimRes)
    -> PrimRes -> f a -> f a -> JSM PrimRes
    forall a b. (a -> b) -> a -> b
    $ JStgStat -> PrimRes
    PrimInline JStgStat
    forall a. Monoid a => a
    mempty

    -- tuple returns
    appT :: [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT :: [JStgExpr] -> FastString -> [JStgExpr] -> JStgStat
    appT []     FastString
    f [JStgExpr]
    xs = FastString -> [JStgExpr] -> JStgStat
    appS FastString
    f [JStgExpr]
    xs
    appT (JStgExpr
    r:[JStgExpr]
    rs) FastString
    f [JStgExpr]
    xs = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    f [JStgExpr]
    xs
      , [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat ((JStgExpr -> StgRet -> JStgStat)
    -> [JStgExpr] -> [StgRet] -> [JStgStat]
    forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
    zipWith (\JStgExpr
    r StgRet
    ret -> JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= (StgRet -> JStgExpr
    foreignRegister StgRet
    ret)) [JStgExpr]
    rs (StgRet -> [StgRet]
    forall a. Enum a => a -> [a]
    enumFrom StgRet
    Ret1))
      ]

    --------------------------------------------
    -- ByteArray indexing
    --------------------------------------------

    -- For every ByteArray, the RTS creates the following views:
    --  i3: Int32 view
    --  u8: Word8 view
    --  u1: Word16 view
    --  f3: Float32 view
    --  f6: Float64 view
    --  dv: generic DataView
    -- It seems a bit weird to mix Int and Word views like this, but perhaps they
    -- are the more common.
    --
    -- See 'h$newByteArray' in 'ghc/rts/js/mem.js' for details.
    --
    -- Note that *byte* indexing can only be done with the generic DataView. Use
    -- read_boff_* and write_boff_* for this.
    --
    -- Other read_* and write_* helpers directly use the more specific views.
    -- Prefer using them over idx_* to make your intent clearer.

    idx_i32, idx_u8, idx_u16, idx_f64, idx_f32 :: JStgExpr -> JStgExpr -> JStgExpr
    idx_i32 :: JStgExpr -> JStgExpr -> JStgExpr
    idx_i32 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    IdxExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "i3") JStgExpr
    i
    idx_u8 :: JStgExpr -> JStgExpr -> JStgExpr
    idx_u8  JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    IdxExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "u8") JStgExpr
    i
    idx_u16 :: JStgExpr -> JStgExpr -> JStgExpr
    idx_u16 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    IdxExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "u1") JStgExpr
    i
    idx_f64 :: JStgExpr -> JStgExpr -> JStgExpr
    idx_f64 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    IdxExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "f6") JStgExpr
    i
    idx_f32 :: JStgExpr -> JStgExpr -> JStgExpr
    idx_f32 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    IdxExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "f3") JStgExpr
    i

    read_u8 :: JStgExpr -> JStgExpr -> JStgExpr
    read_u8 :: JStgExpr -> JStgExpr -> JStgExpr
    read_u8 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    idx_u8 JStgExpr
    a JStgExpr
    i

    read_u16 :: JStgExpr -> JStgExpr -> JStgExpr
    read_u16 :: JStgExpr -> JStgExpr -> JStgExpr
    read_u16 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    idx_u16 JStgExpr
    a JStgExpr
    i

    read_u32 :: JStgExpr -> JStgExpr -> JStgExpr
    read_u32 :: JStgExpr -> JStgExpr -> JStgExpr
    read_u32 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr
    toU32 (JStgExpr -> JStgExpr -> JStgExpr
    idx_i32 JStgExpr
    a JStgExpr
    i)

    read_i8 :: JStgExpr -> JStgExpr -> JStgExpr
    read_i8 :: JStgExpr -> JStgExpr -> JStgExpr
    read_i8 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr
    signExtend8 (JStgExpr -> JStgExpr -> JStgExpr
    idx_u8 JStgExpr
    a JStgExpr
    i)

    read_i16 :: JStgExpr -> JStgExpr -> JStgExpr
    read_i16 :: JStgExpr -> JStgExpr -> JStgExpr
    read_i16 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr
    signExtend16 (JStgExpr -> JStgExpr -> JStgExpr
    idx_u16 JStgExpr
    a JStgExpr
    i)

    read_i32 :: JStgExpr -> JStgExpr -> JStgExpr
    read_i32 :: JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    idx_i32 JStgExpr
    a JStgExpr
    i

    read_f32 :: JStgExpr -> JStgExpr -> JStgExpr
    read_f32 :: JStgExpr -> JStgExpr -> JStgExpr
    read_f32 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    idx_f32 JStgExpr
    a JStgExpr
    i

    read_f64 :: JStgExpr -> JStgExpr -> JStgExpr
    read_f64 :: JStgExpr -> JStgExpr -> JStgExpr
    read_f64 JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    idx_f64 JStgExpr
    a JStgExpr
    i

    read_u64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_u64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_u64 JStgExpr
    a JStgExpr
    i JStgExpr
    rh JStgExpr
    rl = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    rl JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u32 JStgExpr
    a (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    one_)
      , JStgExpr
    rh JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    one_ (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    one_))
      ]

    read_i64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_i64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_i64 JStgExpr
    a JStgExpr
    i JStgExpr
    rh JStgExpr
    rl = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    rl JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_u32 JStgExpr
    a (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    one_)
      , JStgExpr
    rh JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    one_ (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    one_))
      ]

    --------------------------------------
    -- Addr#
    --------------------------------------

    write_addr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_addr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_addr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    o
        -- create the hidden array for arrays if it doesn't exist
      , JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (JStgExpr -> JStgExpr
    Not (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr")) (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr" JStgExpr -> JStgExpr -> JStgStat
    |= JVal -> JStgExpr
    ValExpr ([JStgExpr] -> JVal
    JList [])) JStgStat
    forall a. Monoid a => a
    mempty
      , JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr" JStgExpr -> JStgExpr -> JStgExpr
    .! (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    two_) JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    r
      ]

    read_addr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_addr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_addr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a JStgExpr
    i
      , JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr
    if_ ((JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr") JStgExpr -> JStgExpr -> JStgExpr
    .&&. (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr" JStgExpr -> JStgExpr -> JStgExpr
    .! (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    two_)))
                (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr" JStgExpr -> JStgExpr -> JStgExpr
    .! (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    two_))
                JStgExpr
    null_
      ]

    read_boff_addr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_addr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_addr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a JStgExpr
    i
      , JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr
    if_ ((JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr") JStgExpr -> JStgExpr -> JStgExpr
    .&&. (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr" JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i))
                (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr" JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i)
                JStgExpr
    null_
      ]

    write_boff_addr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_addr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_addr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    o
        -- create the hidden array for arrays if it doesn't exist
      , JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (JStgExpr -> JStgExpr
    Not (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr")) (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr" JStgExpr -> JStgExpr -> JStgStat
    |= JVal -> JStgExpr
    ValExpr ([JStgExpr] -> JVal
    JList [])) JStgStat
    forall a. Monoid a => a
    mempty
      , JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "arr" JStgExpr -> JStgExpr -> JStgExpr
    .! JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    r
      ]

    --------------------------------------
    -- StablePtr
    --------------------------------------

    read_stableptr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_stableptr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_stableptr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    a JStgExpr
    i
      , JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (JStgExpr
    o JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    zero_)
          (JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    null_)
          (JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> JStgExpr
    var FastString
    "h$stablePtrBuf")
      ]

    read_boff_stableptr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_stableptr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_stableptr JStgExpr
    a JStgExpr
    i JStgExpr
    r JStgExpr
    o = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    o JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a JStgExpr
    i
      , JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (JStgExpr
    o JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    zero_)
          (JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    null_)
          (JStgExpr
    r JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> JStgExpr
    var FastString
    "h$stablePtrBuf")
      ]

    write_stableptr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_stableptr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_stableptr JStgExpr
    a JStgExpr
    i JStgExpr
    _r JStgExpr
    o = JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    o
      -- don't store "r" as it must be h$stablePtrBuf or null

    write_boff_stableptr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_stableptr :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_stableptr JStgExpr
    a JStgExpr
    i JStgExpr
    _r JStgExpr
    o = JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    o
      -- don't store "r" as it must be h$stablePtrBuf or null

    write_u8 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u8 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u8 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> JStgExpr -> JStgExpr
    idx_u8 JStgExpr
    a JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    v

    write_u16 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u16 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u16 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> JStgExpr -> JStgExpr
    idx_u16 JStgExpr
    a JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    v

    write_u32 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u32 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u32 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> JStgExpr -> JStgExpr
    idx_i32 JStgExpr
    a JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    v

    write_i8 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i8 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i8 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> JStgExpr -> JStgExpr
    idx_u8 JStgExpr
    a JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    v

    write_i16 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i16 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i16 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> JStgExpr -> JStgExpr
    idx_u16 JStgExpr
    a JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    v

    write_i32 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> JStgExpr -> JStgExpr
    idx_i32 JStgExpr
    a JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    v

    write_f32 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_f32 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_f32 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> JStgExpr -> JStgExpr
    idx_f32 JStgExpr
    a JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    v

    write_f64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_f64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_f64 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> JStgExpr -> JStgExpr
    idx_f64 JStgExpr
    a JStgExpr
    i JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    v

    write_u64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u32 JStgExpr
    a (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    one_)         JStgExpr
    l
      , JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    one_ (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    one_)) JStgExpr
    h
      ]

    write_i64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u32 JStgExpr
    a (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    one_)         JStgExpr
    l
      , JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    one_ (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    one_)) JStgExpr
    h
      ]

    -- Data View helper functions: byte indexed!
    --
    -- The argument list consists of the array @a@, the index @i@, and the new value
    -- to set (in the case of a setter) @v@.

    write_boff_i8, write_boff_u8, write_boff_i16, write_boff_u16, write_boff_i32, write_boff_u32, write_boff_f32, write_boff_f64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i8 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i8  JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i8 JStgExpr
    a JStgExpr
    i JStgExpr
    v
    write_boff_u8 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u8  JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_u8 JStgExpr
    a JStgExpr
    i JStgExpr
    v
    write_boff_i16 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i16 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> [JStgExpr] -> JStgStat
    ApplStat (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "setInt16"  ) [JStgExpr
    i, JStgExpr
    v, JStgExpr
    true_]
    write_boff_u16 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u16 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> [JStgExpr] -> JStgStat
    ApplStat (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "setUint16" ) [JStgExpr
    i, JStgExpr
    v, JStgExpr
    true_]
    write_boff_i32 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> [JStgExpr] -> JStgStat
    ApplStat (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "setInt32"  ) [JStgExpr
    i, JStgExpr
    v, JStgExpr
    true_]
    write_boff_u32 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> [JStgExpr] -> JStgStat
    ApplStat (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "setUint32" ) [JStgExpr
    i, JStgExpr
    v, JStgExpr
    true_]
    write_boff_f32 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_f32 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> [JStgExpr] -> JStgStat
    ApplStat (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "setFloat32") [JStgExpr
    i, JStgExpr
    v, JStgExpr
    true_]
    write_boff_f64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_f64 JStgExpr
    a JStgExpr
    i JStgExpr
    v = JStgExpr -> [JStgExpr] -> JStgStat
    ApplStat (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "setFloat64") [JStgExpr
    i, JStgExpr
    v, JStgExpr
    true_]

    write_boff_i64, write_boff_u64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    i (Integer -> JStgExpr
    Int Integer
    4)) JStgExpr
    h
      , JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a JStgExpr
    i JStgExpr
    l
      ]
    write_boff_u64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u64 JStgExpr
    a JStgExpr
    i JStgExpr
    h JStgExpr
    l = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    i (Integer -> JStgExpr
    Int Integer
    4)) JStgExpr
    h
      , JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    a JStgExpr
    i JStgExpr
    l
      ]

    read_boff_i8, read_boff_u8, read_boff_i16, read_boff_u16, read_boff_i32, read_boff_u32, read_boff_f32, read_boff_f64 :: JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i8 :: JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i8  JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    read_i8 JStgExpr
    a JStgExpr
    i
    read_boff_u8 :: JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u8  JStgExpr
    a JStgExpr
    i = JStgExpr -> JStgExpr -> JStgExpr
    read_u8 JStgExpr
    a JStgExpr
    i
    read_boff_i16 :: JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i16 JStgExpr
    a JStgExpr
    i = JStgExpr -> [JStgExpr] -> JStgExpr
    ApplExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "getInt16"  ) [JStgExpr
    i, JStgExpr
    true_]
    read_boff_u16 :: JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u16 JStgExpr
    a JStgExpr
    i = JStgExpr -> [JStgExpr] -> JStgExpr
    ApplExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "getUint16" ) [JStgExpr
    i, JStgExpr
    true_]
    read_boff_i32 :: JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a JStgExpr
    i = JStgExpr -> [JStgExpr] -> JStgExpr
    ApplExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "getInt32"  ) [JStgExpr
    i, JStgExpr
    true_]
    read_boff_u32 :: JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a JStgExpr
    i = JStgExpr -> [JStgExpr] -> JStgExpr
    ApplExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "getUint32" ) [JStgExpr
    i, JStgExpr
    true_]
    read_boff_f32 :: JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f32 JStgExpr
    a JStgExpr
    i = JStgExpr -> [JStgExpr] -> JStgExpr
    ApplExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "getFloat32") [JStgExpr
    i, JStgExpr
    true_]
    read_boff_f64 :: JStgExpr -> JStgExpr -> JStgExpr
    read_boff_f64 JStgExpr
    a JStgExpr
    i = JStgExpr -> [JStgExpr] -> JStgExpr
    ApplExpr (JStgExpr
    a JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "dv" JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "getFloat64") [JStgExpr
    i, JStgExpr
    true_]

    read_boff_i64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_i64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_i64 JStgExpr
    a JStgExpr
    i JStgExpr
    rh JStgExpr
    rl = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    rh JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_i32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    i (Integer -> JStgExpr
    Int Integer
    4))
      , JStgExpr
    rl JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a JStgExpr
    i
      ]

    read_boff_u64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_u64 :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read_boff_u64 JStgExpr
    a JStgExpr
    i JStgExpr
    rh JStgExpr
    rl = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    rh JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    i (Integer -> JStgExpr
    Int Integer
    4))
      , JStgExpr
    rl JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    a JStgExpr
    i
      ]

    fetchOpByteArray :: (JStgExpr -> JStgExpr -> JStgExpr) -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpByteArray :: (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpByteArray JStgExpr -> JStgExpr -> JStgExpr
    op JStgExpr
    tgt JStgExpr
    src JStgExpr
    i JStgExpr
    v = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    tgt JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_i32 JStgExpr
    src JStgExpr
    i
      , JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_i32 JStgExpr
    src JStgExpr
    i (JStgExpr -> JStgExpr -> JStgExpr
    op JStgExpr
    tgt JStgExpr
    v)
      ]

    fetchOpAddr :: (JStgExpr -> JStgExpr -> JStgExpr) -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpAddr :: (JStgExpr -> JStgExpr -> JStgExpr)
    -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    fetchOpAddr JStgExpr -> JStgExpr -> JStgExpr
    op JStgExpr
    tgt JStgExpr
    src JStgExpr
    i JStgExpr
    v = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    tgt JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read_boff_u32 JStgExpr
    src JStgExpr
    i
      , JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write_boff_u32 JStgExpr
    src JStgExpr
    i (JStgExpr -> JStgExpr -> JStgExpr
    op JStgExpr
    tgt JStgExpr
    v)
      ]

    casOp
      :: (JStgExpr -> JStgExpr -> JStgExpr)          -- read
      -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat) -- write
      -> JStgExpr                     -- target register to store result
      -> JStgExpr                     -- source array
      -> JStgExpr                     -- index
      -> JStgExpr                     -- old value to compare
      -> JStgExpr                     -- new value to write
      -> JStgStat
    casOp :: (JStgExpr -> JStgExpr -> JStgExpr)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    casOp JStgExpr -> JStgExpr -> JStgExpr
    read JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write JStgExpr
    tgt JStgExpr
    src JStgExpr
    i JStgExpr
    old JStgExpr
    new = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr
    tgt JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> JStgExpr -> JStgExpr
    read JStgExpr
    src JStgExpr
    i
      , JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (JStgExpr
    tgt JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    old)
            (JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write JStgExpr
    src JStgExpr
    i JStgExpr
    new)
             JStgStat
    forall a. Monoid a => a
    mempty
      ]

    casOp2
      :: (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat) -- read
      -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat) -- write
      -> (JStgExpr,JStgExpr)             -- target registers to store result
      -> JStgExpr                     -- source array
      -> JStgExpr                     -- index
      -> (JStgExpr,JStgExpr)             -- old value to compare
      -> (JStgExpr,JStgExpr)             -- new value to write
      -> JStgStat
    casOp2 :: (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat)
    -> (JStgExpr, JStgExpr)
    -> JStgExpr
    -> JStgExpr
    -> (JStgExpr, JStgExpr)
    -> (JStgExpr, JStgExpr)
    -> JStgStat
    casOp2 JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write (JStgExpr
    tgt1,JStgExpr
    tgt2) JStgExpr
    src JStgExpr
    i (JStgExpr
    old1,JStgExpr
    old2) (JStgExpr
    new1,JStgExpr
    new2) = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    read JStgExpr
    src JStgExpr
    i JStgExpr
    tgt1 JStgExpr
    tgt2
      , JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS ((JStgExpr
    tgt2 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    old2) JStgExpr -> JStgExpr -> JStgExpr
    .&&. (JStgExpr
    tgt1 JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    old1))
            (JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    write JStgExpr
    src JStgExpr
    i JStgExpr
    new1 JStgExpr
    new2)
             JStgStat
    forall a. Monoid a => a
    mempty
      ]

    --------------------------------------------------------------------------------
    --                            Lifted Arrays
    --------------------------------------------------------------------------------
    -- | lifted arrays
    cloneArray :: Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    cloneArray :: Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat
    cloneArray Bool
    bound_check JStgExpr
    tgt JStgExpr
    src JStgExpr
    start JStgExpr
    len =
      Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    bound_check JStgExpr
    src JStgExpr
    start JStgExpr
    len
      (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
          [ JStgExpr
    tgt JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr -> [JStgExpr] -> JStgExpr
    ApplExpr (JStgExpr
    src JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "slice") [JStgExpr
    start, JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    len JStgExpr
    start]
          , JStgExpr
    tgt JStgExpr -> FastString -> JStgExpr
    .^ FastString
    closureMeta_   JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    zero_
          , JStgExpr
    tgt JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "__ghcjsArray" JStgExpr -> JStgExpr -> JStgStat
    |= JStgExpr
    true_
          ]

    newByteArray :: JStgExpr -> JStgExpr -> JStgStat
    newByteArray :: JStgExpr -> JStgExpr -> JStgStat
    newByteArray JStgExpr
    tgt JStgExpr
    len =
      JStgExpr
    tgt JStgExpr -> JStgExpr -> JStgStat
    |= FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$newByteArray" [JStgExpr
    len]

    -- | Check that index is positive and below a max value. Halt the process with
    -- error code 134 otherwise. This is used to implement -fcheck-prim-bounds
    check_bound
      :: JStgExpr -- ^ Max index expression
      -> Bool  -- ^ Should we do bounds checking?
      -> JStgExpr -- ^ Index
      -> JStgStat -- ^ Result
      -> JStgStat
    check_bound :: JStgExpr -> Bool -> JStgExpr -> JStgStat -> JStgStat
    check_bound JStgExpr
    _         Bool
    False JStgExpr
    _ JStgStat
    r = JStgStat
    r
    check_bound JStgExpr
    max_index Bool
    True  JStgExpr
    i JStgStat
    r = [JStgStat] -> JStgStat
    forall a. Monoid a => [a] -> a
    mconcat
      [ JStgExpr -> JStgStat -> JStgStat
    jwhenS ((JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    zero_) JStgExpr -> JStgExpr -> JStgExpr
    .||. (JStgExpr
    i JStgExpr -> JStgExpr -> JStgExpr
    .>=. JStgExpr
    max_index)) (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $
          JStgExpr -> JStgStat
    returnS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$exitProcess" [Integer -> JStgExpr
    Int Integer
    134])
      , JStgStat
    r
      ]

    -- | Bounds checking using ".length" property (Arrays)
    bnd_arr
      :: Bool  -- ^ Should we do bounds checking?
      -> JStgExpr -- ^ Array
      -> JStgExpr -- ^ Index
      -> JStgStat -- ^ Result
      -> JStgStat
    bnd_arr :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    do_check JStgExpr
    arr = JStgExpr -> Bool -> JStgExpr -> JStgStat -> JStgStat
    check_bound (JStgExpr
    arr JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "length") Bool
    do_check

    -- | Range bounds checking using ".length" property (Arrays)
    --
    -- Empty ranges trivially pass the check
    bnd_arr_range
      :: Bool  -- ^ Should we do bounds checking?
      -> JStgExpr -- ^ Array
      -> JStgExpr -- ^ Index
      -> JStgExpr -- ^ Range size
      -> JStgStat -- ^ Result
      -> JStgStat
    bnd_arr_range :: Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr_range Bool
    False JStgExpr
    _arr JStgExpr
    _i JStgExpr
    _n JStgStat
    r = JStgStat
    r
    bnd_arr_range Bool
    True   JStgExpr
    arr  JStgExpr
    i  JStgExpr
    n JStgStat
    r =
      JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (JStgExpr
    n JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    zero_) (JStgExpr -> JStgStat
    returnS (JStgExpr -> JStgStat) -> JStgExpr -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$exitProcess" [Integer -> JStgExpr
    Int Integer
    134]) (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $
      -- Empty ranges trivially pass the check
      JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (JStgExpr
    n JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    zero_)
          JStgStat
    r
          (Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    True JStgExpr
    arr JStgExpr
    i (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_arr Bool
    True JStgExpr
    arr (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    i (JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    n JStgExpr
    one_)) JStgStat
    r)

    -- | Bounds checking using ".len" property (ByteArrays)
    bnd_ba
      :: Bool  -- ^ Should we do bounds checking?
      -> JStgExpr -- ^ Array
      -> JStgExpr -- ^ Index
      -> JStgStat -- ^ Result
      -> JStgStat
    bnd_ba :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba Bool
    do_check JStgExpr
    arr = JStgExpr -> Bool -> JStgExpr -> JStgStat -> JStgStat
    check_bound (JStgExpr
    arr JStgExpr -> FastString -> JStgExpr
    .^ FastString
    "len") Bool
    do_check

    -- | ByteArray bounds checking (byte offset, 8-bit value)
    bnd_ba8 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba8 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba8 = Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba

    -- | ByteArray bounds checking (byte offset, 16-bit value)
    bnd_ba16 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba16 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba16 Bool
    do_check JStgExpr
    arr JStgExpr
    idx JStgStat
    r =
      -- check that idx non incremented is in range:
      -- (idx + 1) may be in range while idx isn't
      Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba Bool
    do_check JStgExpr
    arr JStgExpr
    idx
      (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba Bool
    do_check JStgExpr
    arr (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    idx JStgExpr
    one_) JStgStat
    r

    -- | ByteArray bounds checking (byte offset, 32-bit value)
    bnd_ba32 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    do_check JStgExpr
    arr JStgExpr
    idx JStgStat
    r =
      -- check that idx non incremented is in range:
      -- (idx + 3) may be in range while idx isn't
      Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba Bool
    do_check JStgExpr
    arr JStgExpr
    idx
      (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba Bool
    do_check JStgExpr
    arr (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    idx JStgExpr
    three_) JStgStat
    r

    -- | ByteArray bounds checking (byte offset, 64-bit value)
    bnd_ba64 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    do_check JStgExpr
    arr JStgExpr
    idx JStgStat
    r =
      -- check that idx non incremented is in range:
      -- (idx + 7) may be in range while idx isn't
      Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba Bool
    do_check JStgExpr
    arr JStgExpr
    idx
      (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba Bool
    do_check JStgExpr
    arr (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    idx (Integer -> JStgExpr
    Int Integer
    7)) JStgStat
    r

    -- | ByteArray bounds checking (8-bit offset, 8-bit value)
    bnd_ix8 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix8 = Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba8

    -- | ByteArray bounds checking (16-bit offset, 16-bit value)
    bnd_ix16 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix16 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix16 Bool
    do_check JStgExpr
    arr JStgExpr
    idx JStgStat
    r = Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba16 Bool
    do_check JStgExpr
    arr (JStgExpr
    idx JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    one_) JStgStat
    r

    -- | ByteArray bounds checking (32-bit offset, 32-bit value)
    bnd_ix32 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix32 Bool
    do_check JStgExpr
    arr JStgExpr
    idx JStgStat
    r = Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba32 Bool
    do_check JStgExpr
    arr (JStgExpr
    idx JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    two_) JStgStat
    r

    -- | ByteArray bounds checking (64-bit offset, 64-bit value)
    bnd_ix64 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 :: Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ix64 Bool
    do_check JStgExpr
    arr JStgExpr
    idx JStgStat
    r = Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba64 Bool
    do_check JStgExpr
    arr (JStgExpr
    idx JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    three_) JStgStat
    r

    -- | Bounds checking on a range and using ".len" property (ByteArrays)
    --
    -- Empty ranges trivially pass the check
    bnd_ba_range
      :: Bool  -- ^ Should we do bounds checking?
      -> JStgExpr -- ^ Array
      -> JStgExpr -- ^ Index
      -> JStgExpr -- ^ Range size
      -> JStgStat -- ^ Result
      -> JStgStat
    bnd_ba_range :: Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba_range Bool
    False JStgExpr
    _  JStgExpr
    _ JStgExpr
    _ JStgStat
    r = JStgStat
    r
    bnd_ba_range Bool
    True  JStgExpr
    xs JStgExpr
    i JStgExpr
    n JStgStat
    r =
      JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (JStgExpr
    n JStgExpr -> JStgExpr -> JStgExpr
    .<. JStgExpr
    zero_) (JStgExpr -> JStgStat
    returnS (JStgExpr -> JStgStat) -> JStgExpr -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$exitProcess" [Integer -> JStgExpr
    Int Integer
    134]) (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $
      -- Empty ranges trivially pass the check
      JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (JStgExpr
    n JStgExpr -> JStgExpr -> JStgExpr
    .===. JStgExpr
    zero_)
          JStgStat
    r
          (Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba Bool
    True JStgExpr
    xs (JStgExpr -> JStgExpr -> JStgExpr
    Add JStgExpr
    i (JStgExpr -> JStgExpr -> JStgExpr
    Sub JStgExpr
    n JStgExpr
    one_)) (Bool -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba Bool
    True JStgExpr
    xs JStgExpr
    i JStgStat
    r))

    checkOverlapByteArray
      :: Bool  -- ^ Should we do bounds checking?
      -> JStgExpr -- ^ First array
      -> JStgExpr -- ^ First offset
      -> JStgExpr -- ^ Second array
      -> JStgExpr -- ^ Second offset
      -> JStgExpr -- ^ Range size
      -> JStgStat -- ^ Result
      -> JStgStat
    checkOverlapByteArray :: Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    -> JStgStat
    checkOverlapByteArray Bool
    False JStgExpr
    _ JStgExpr
    _ JStgExpr
    _ JStgExpr
    _ JStgExpr
    _ JStgStat
    r    = JStgStat
    r
    checkOverlapByteArray Bool
    True JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n JStgStat
    r =
      JStgExpr -> JStgStat -> JStgStat -> JStgStat
    ifS (FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$checkOverlapByteArray" [JStgExpr
    a1, JStgExpr
    o1, JStgExpr
    a2, JStgExpr
    o2, JStgExpr
    n])
        JStgStat
    r
        (JStgExpr -> JStgStat
    returnS (JStgExpr -> JStgStat) -> JStgExpr -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgExpr
    app FastString
    "h$exitProcess" [Integer -> JStgExpr
    Int Integer
    134])

    copyByteArray :: Bool -> Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr -> PrimRes
    copyByteArray :: Bool
    -> Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> PrimRes
    copyByteArray Bool
    allow_overlap Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n = JStgStat -> PrimRes
    PrimInline (JStgStat -> PrimRes) -> JStgStat -> PrimRes
    forall a b. (a -> b) -> a -> b
    $
      JStgStat -> JStgStat
    check (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall a b. (a -> b) -> a -> b
    $ FastString -> [JStgExpr] -> JStgStat
    appS FastString
    "h$copyMutableByteArray" [JStgExpr
    a1,JStgExpr
    o1,JStgExpr
    a2,JStgExpr
    o2,JStgExpr
    n]
      where
          check :: JStgStat -> JStgStat
    check = Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba_range Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    n
                  (JStgStat -> JStgStat)
    -> (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Bool -> JStgExpr -> JStgExpr -> JStgExpr -> JStgStat -> JStgStat
    bnd_ba_range Bool
    bound JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n
                  (JStgStat -> JStgStat)
    -> (JStgStat -> JStgStat) -> JStgStat -> JStgStat
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . (if Bool -> Bool
    not Bool
    allow_overlap then Bool
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgExpr
    -> JStgStat
    -> JStgStat
    checkOverlapByteArray Bool
    bound JStgExpr
    a1 JStgExpr
    o1 JStgExpr
    a2 JStgExpr
    o2 JStgExpr
    n else JStgStat -> JStgStat
    forall a. a -> a
    id)

    -- e|0 (32 bit signed integer truncation) required because of JS numbers. e|0
    -- converts e to an Int32. Note that e|0 _is still a Double_ because JavaScript.
    -- So (x|0) * (y|0) can still return values outside of the Int32 range. You have
    -- been warned!
    toI32 :: JStgExpr -> JStgExpr
    toI32 :: JStgExpr -> JStgExpr
    toI32 JStgExpr
    e = JStgExpr -> JStgExpr -> JStgExpr
    BOr JStgExpr
    e JStgExpr
    zero_

    -- e>>>0  (32 bit unsigned integer truncation)
    -- required because of JS numbers. e>>>0 converts e to a Word32
    -- so  (-2147483648)       >>> 0  = 2147483648
    -- and ((-2147483648) >>>0) | 0   = -2147483648
    toU32 :: JStgExpr -> JStgExpr
    toU32 :: JStgExpr -> JStgExpr
    toU32 JStgExpr
    e = JStgExpr
    e JStgExpr -> JStgExpr -> JStgExpr
    .>>>. JStgExpr
    zero_

    quotShortInt :: Int -> JStgExpr -> JStgExpr -> JStgExpr
    quotShortInt :: Int -> JStgExpr -> JStgExpr -> JStgExpr
    quotShortInt Int
    bits JStgExpr
    x JStgExpr
    y = JStgExpr -> JStgExpr -> JStgExpr
    BAnd (JStgExpr -> JStgExpr
    signed JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    `Div` JStgExpr -> JStgExpr
    signed JStgExpr
    y) JStgExpr
    mask
      where
        signed :: JStgExpr -> JStgExpr
    signed JStgExpr
    z = (JStgExpr
    z JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    shift) JStgExpr -> JStgExpr -> JStgExpr
    .>>. JStgExpr
    shift
        shift :: JStgExpr
    shift    = Integer -> JStgExpr
    Int (Integer
    32 Integer -> Integer -> Integer
    forall a. Num a => a -> a -> a
    - Int -> Integer
    forall a. Integral a => a -> Integer
    toInteger Int
    bits)
        mask :: JStgExpr
    mask     = Integer -> JStgExpr
    Int (((Integer
    2::Integer) Integer -> Integer -> Integer
    forall a b. (Num a, Integral b) => a -> b -> a
    ^ Int -> Integer
    forall a. Integral a => a -> Integer
    toInteger Int
    bits) Integer -> Integer -> Integer
    forall a. Num a => a -> a -> a
    - Integer
    1)

    remShortInt :: Int -> JStgExpr -> JStgExpr -> JStgExpr
    remShortInt :: Int -> JStgExpr -> JStgExpr -> JStgExpr
    remShortInt Int
    bits JStgExpr
    x JStgExpr
    y = JStgExpr -> JStgExpr -> JStgExpr
    BAnd (JStgExpr -> JStgExpr
    signed JStgExpr
    x JStgExpr -> JStgExpr -> JStgExpr
    `Mod` JStgExpr -> JStgExpr
    signed JStgExpr
    y) JStgExpr
    mask
      where
        signed :: JStgExpr -> JStgExpr
    signed JStgExpr
    z = (JStgExpr
    z JStgExpr -> JStgExpr -> JStgExpr
    .<<. JStgExpr
    shift) JStgExpr -> JStgExpr -> JStgExpr
    .>>. JStgExpr
    shift
        shift :: JStgExpr
    shift    = Integer -> JStgExpr
    Int (Integer
    32 Integer -> Integer -> Integer
    forall a. Num a => a -> a -> a
    - Int -> Integer
    forall a. Integral a => a -> Integer
    toInteger Int
    bits)
        mask :: JStgExpr
    mask     = Integer -> JStgExpr
    Int (((Integer
    2::Integer) Integer -> Integer -> Integer
    forall a b. (Num a, Integral b) => a -> b -> a
    ^ Int -> Integer
    forall a. Integral a => a -> Integer
    toInteger Int
    bits) Integer -> Integer -> Integer
    forall a. Num a => a -> a -> a
    - Integer
    1)