add partial memory instructions for builder
This commit is contained in:
@@ -30,7 +30,8 @@ module Language.Wasm.Builder (
|
|||||||
i32c, i64c, f32c, f64c,
|
i32c, i64c, f32c, f64c,
|
||||||
add, sub, mul, and,
|
add, sub, mul, and,
|
||||||
eq, lt_s, lt_u,
|
eq, lt_s, lt_u,
|
||||||
load, store,
|
load, load8u, load8s, load16u, load16s, load32u, load32s,
|
||||||
|
store, store8, store16, store32,
|
||||||
call, invoke,
|
call, invoke,
|
||||||
ifExpr, ifStmt, loopExpr, loopStmt, for,
|
ifExpr, ifStmt, loopExpr, loopStmt, for,
|
||||||
trap, unreachable,
|
trap, unreachable,
|
||||||
@@ -221,6 +222,84 @@ load t addr offset align = do
|
|||||||
F64 -> appendExpr [F64Load $ MemArg (fromIntegral offset) (fromIntegral align)]
|
F64 -> appendExpr [F64Load $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
return Proxy
|
return Proxy
|
||||||
|
|
||||||
|
load8u :: (ValueTypeable t, IsInt (Proxy t) ~ True, Producer addr, OutType addr ~ Proxy I32, Integral offset, Integral align)
|
||||||
|
=> Proxy t
|
||||||
|
-> addr
|
||||||
|
-> offset
|
||||||
|
-> align
|
||||||
|
-> GenFun (Proxy t)
|
||||||
|
load8u t addr offset align = do
|
||||||
|
produce addr
|
||||||
|
case getValueType t of
|
||||||
|
I32 -> appendExpr [I32Load8U $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
I64 -> appendExpr [I64Load8U $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
_ -> error "Impossible by type constraint"
|
||||||
|
return Proxy
|
||||||
|
|
||||||
|
load8s :: (ValueTypeable t, IsInt (Proxy t) ~ True, Producer addr, OutType addr ~ Proxy I32, Integral offset, Integral align)
|
||||||
|
=> Proxy t
|
||||||
|
-> addr
|
||||||
|
-> offset
|
||||||
|
-> align
|
||||||
|
-> GenFun (Proxy t)
|
||||||
|
load8s t addr offset align = do
|
||||||
|
produce addr
|
||||||
|
case getValueType t of
|
||||||
|
I32 -> appendExpr [I32Load8S $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
I64 -> appendExpr [I64Load8S $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
_ -> error "Impossible by type constraint"
|
||||||
|
return Proxy
|
||||||
|
|
||||||
|
load16u :: (ValueTypeable t, IsInt (Proxy t) ~ True, Producer addr, OutType addr ~ Proxy I32, Integral offset, Integral align)
|
||||||
|
=> Proxy t
|
||||||
|
-> addr
|
||||||
|
-> offset
|
||||||
|
-> align
|
||||||
|
-> GenFun (Proxy t)
|
||||||
|
load16u t addr offset align = do
|
||||||
|
produce addr
|
||||||
|
case getValueType t of
|
||||||
|
I32 -> appendExpr [I32Load16U $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
I64 -> appendExpr [I64Load16U $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
_ -> error "Impossible by type constraint"
|
||||||
|
return Proxy
|
||||||
|
|
||||||
|
load16s :: (ValueTypeable t, IsInt (Proxy t) ~ True, Producer addr, OutType addr ~ Proxy I32, Integral offset, Integral align)
|
||||||
|
=> Proxy t
|
||||||
|
-> addr
|
||||||
|
-> offset
|
||||||
|
-> align
|
||||||
|
-> GenFun (Proxy t)
|
||||||
|
load16s t addr offset align = do
|
||||||
|
produce addr
|
||||||
|
case getValueType t of
|
||||||
|
I32 -> appendExpr [I32Load16S $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
I64 -> appendExpr [I64Load16S $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
_ -> error "Impossible by type constraint"
|
||||||
|
return Proxy
|
||||||
|
|
||||||
|
load32u :: (ValueTypeable t, IsInt (Proxy t) ~ True, Producer addr, OutType addr ~ Proxy I32, Integral offset, Integral align)
|
||||||
|
=> Proxy t
|
||||||
|
-> addr
|
||||||
|
-> offset
|
||||||
|
-> align
|
||||||
|
-> GenFun (Proxy t)
|
||||||
|
load32u t addr offset align = do
|
||||||
|
produce addr
|
||||||
|
appendExpr [I64Load32U $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
return Proxy
|
||||||
|
|
||||||
|
load32s :: (ValueTypeable t, IsInt (Proxy t) ~ True, Producer addr, OutType addr ~ Proxy I32, Integral offset, Integral align)
|
||||||
|
=> Proxy t
|
||||||
|
-> addr
|
||||||
|
-> offset
|
||||||
|
-> align
|
||||||
|
-> GenFun (Proxy t)
|
||||||
|
load32s t addr offset align = do
|
||||||
|
produce addr
|
||||||
|
appendExpr [I64Load32S $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
return Proxy
|
||||||
|
|
||||||
store :: (Producer addr, OutType addr ~ Proxy I32, Producer val, Integral offset, Integral align)
|
store :: (Producer addr, OutType addr ~ Proxy I32, Producer val, Integral offset, Integral align)
|
||||||
=> addr
|
=> addr
|
||||||
-> val
|
-> val
|
||||||
@@ -236,6 +315,45 @@ store addr val offset align = do
|
|||||||
F32 -> appendExpr [F32Store $ MemArg (fromIntegral offset) (fromIntegral align)]
|
F32 -> appendExpr [F32Store $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
F64 -> appendExpr [F64Store $ MemArg (fromIntegral offset) (fromIntegral align)]
|
F64 -> appendExpr [F64Store $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
|
||||||
|
store8 :: (Producer addr, OutType addr ~ Proxy I32, Producer val, IsInt (OutType val) ~ True, Integral offset, Integral align)
|
||||||
|
=> addr
|
||||||
|
-> val
|
||||||
|
-> offset
|
||||||
|
-> align
|
||||||
|
-> GenFun ()
|
||||||
|
store8 addr val offset align = do
|
||||||
|
produce val
|
||||||
|
produce addr
|
||||||
|
case asValueType val of
|
||||||
|
I32 -> appendExpr [I32Store8 $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
I64 -> appendExpr [I64Store8 $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
_ -> error "Impossible by type constraint"
|
||||||
|
|
||||||
|
store16 :: (Producer addr, OutType addr ~ Proxy I32, Producer val, IsInt (OutType val) ~ True, Integral offset, Integral align)
|
||||||
|
=> addr
|
||||||
|
-> val
|
||||||
|
-> offset
|
||||||
|
-> align
|
||||||
|
-> GenFun ()
|
||||||
|
store16 addr val offset align = do
|
||||||
|
produce val
|
||||||
|
produce addr
|
||||||
|
case asValueType val of
|
||||||
|
I32 -> appendExpr [I32Store16 $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
I64 -> appendExpr [I64Store16 $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
_ -> error "Impossible by type constraint"
|
||||||
|
|
||||||
|
store32 :: (Producer addr, OutType addr ~ Proxy I32, Producer val, OutType val ~ Proxy I64, Integral offset, Integral align)
|
||||||
|
=> addr
|
||||||
|
-> val
|
||||||
|
-> offset
|
||||||
|
-> align
|
||||||
|
-> GenFun ()
|
||||||
|
store32 addr val offset align = do
|
||||||
|
produce val
|
||||||
|
produce addr
|
||||||
|
appendExpr [I64Store32 $ MemArg (fromIntegral offset) (fromIntegral align)]
|
||||||
|
|
||||||
invoke :: Natural -> [GenFun a] -> GenFun ()
|
invoke :: Natural -> [GenFun a] -> GenFun ()
|
||||||
invoke idx args = sequence_ args >> appendExpr [Call idx]
|
invoke idx args = sequence_ args >> appendExpr [Call idx]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user