{-# 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)