builtinsCtx :: Ctx
builtinsCtx = Ctx [
  asUnaryIntrinsic  "-"   "-_I32"   ((\x -> -x) :: Int32 -> Int32),
  asUnaryIntrinsic  "not" "not"     not,
  asBinaryIntrinsic "+"   "+_I32"   ((+)  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "-"   "-_I32"   ((-)  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "*"   "*_I32"   ((*)  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "/"   "/_I32"   (div  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "rem" "rem_I32" (rem  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "or"  "or"      (||),
  asBinaryIntrinsic "and" "and"     (&&),
  asBinaryIntrinsic "="   "=_I32"   ((==) :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic "<>"  "<>_I32"  ((/=) :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic "<"   "<_I32"   ((<)  :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic "<="  "<=_I32"  ((<=) :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic ">"   ">_I32"   ((>)  :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic ">="  ">=_I32"  ((>=) :: Int32 -> Int32 -> Bool) ]
builtinsCtx :: Ctx
builtinsCtx = Ctx [
  asUnaryIntrinsic  "-"   "-_I32"   ((\x -> -x) :: Int32 -> Int32),
  asUnaryIntrinsic  "not" "not"     not,
  asBinaryIntrinsic "+"   "+_I32"   ((+)  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "-"   "-_I32"   ((-)  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "*"   "*_I32"   ((*)  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "/"   "/_I32"   (div  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "rem" "rem_I32" (rem  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "or"  "or"      (||),
  asBinaryIntrinsic "and" "and"     (&&),
  asBinaryIntrinsic "="   "=_I32"   ((==) :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic "<>"  "<>_I32"  ((/=) :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic "<"   "<_I32"   ((<)  :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic "<="  "<=_I32"  ((<=) :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic ">"   ">_I32"   ((>)  :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic ">="  ">=_I32"  ((>=) :: Int32 -> Int32 -> Bool) ]
builtinsCtx = Ctx [
  asUnaryIntrinsic  "-"   "-_I32"   ((\x -> -x) :: Int32 -> Int32),
  asUnaryIntrinsic  "not" "not"     not,
  asBinaryIntrinsic "+"   "+_I32"   ((+)  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "-"   "-_I32"   ((-)  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "*"   "*_I32"   ((*)  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "/"   "/_I32"   (div  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "rem" "rem_I32" (rem  :: Int32 -> Int32 -> Int32),
  asBinaryIntrinsic "or"  "or"      (||),
  asBinaryIntrinsic "and" "and"     (&&),
  asBinaryIntrinsic "="   "=_I32"   ((==) :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic "<>"  "<>_I32"  ((/=) :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic "<"   "<_I32"   ((<)  :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic "<="  "<=_I32"  ((<=) :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic ">"   ">_I32"   ((>)  :: Int32 -> Int32 -> Bool),
  asBinaryIntrinsic ">="  ">=_I32"  ((>=) :: Int32 -> Int32 -> Bool) ]