70 lines
3.2 KiB
Python
70 lines
3.2 KiB
Python
"""
|
|
Helper functions to quickly generate WASM code
|
|
"""
|
|
from typing import Any, Dict, List, Optional, Type
|
|
|
|
import functools
|
|
|
|
from . import wasm
|
|
|
|
#pylint: disable=C0103,C0115,C0116,R0201,R0902
|
|
|
|
class Prefix_inn_fnn:
|
|
def __init__(self, prefix: str) -> None:
|
|
self.prefix = prefix
|
|
|
|
# 6.5.5. Memory Instructions
|
|
self.load = functools.partial(wasm.Statement, f'{self.prefix}.load')
|
|
self.store = functools.partial(wasm.Statement, f'{self.prefix}.store')
|
|
|
|
# 6.5.6. Numeric Instructions
|
|
self.clz = functools.partial(wasm.Statement, f'{self.prefix}.clz')
|
|
self.ctz = functools.partial(wasm.Statement, f'{self.prefix}.ctz')
|
|
self.popcnt = functools.partial(wasm.Statement, f'{self.prefix}.popcnt')
|
|
self.add = functools.partial(wasm.Statement, f'{self.prefix}.add')
|
|
self.sub = functools.partial(wasm.Statement, f'{self.prefix}.sub')
|
|
self.mul = functools.partial(wasm.Statement, f'{self.prefix}.mul')
|
|
self.div_s = functools.partial(wasm.Statement, f'{self.prefix}.div_s')
|
|
self.div_u = functools.partial(wasm.Statement, f'{self.prefix}.div_u')
|
|
self.rem_s = functools.partial(wasm.Statement, f'{self.prefix}.rem_s')
|
|
self.rem_u = functools.partial(wasm.Statement, f'{self.prefix}.rem_u')
|
|
self.and_ = functools.partial(wasm.Statement, f'{self.prefix}.and')
|
|
self.or_ = functools.partial(wasm.Statement, f'{self.prefix}.or')
|
|
self.xor = functools.partial(wasm.Statement, f'{self.prefix}.xor')
|
|
self.shl = functools.partial(wasm.Statement, f'{self.prefix}.shl')
|
|
self.shr_s = functools.partial(wasm.Statement, f'{self.prefix}.shr_s')
|
|
self.shr_u = functools.partial(wasm.Statement, f'{self.prefix}.shr_u')
|
|
self.rotl = functools.partial(wasm.Statement, f'{self.prefix}.rotl')
|
|
self.rotr = functools.partial(wasm.Statement, f'{self.prefix}.rotr')
|
|
|
|
self.eqz = functools.partial(wasm.Statement, f'{self.prefix}.eqz')
|
|
self.eq = functools.partial(wasm.Statement, f'{self.prefix}.eq')
|
|
self.ne = functools.partial(wasm.Statement, f'{self.prefix}.ne')
|
|
self.lt_s = functools.partial(wasm.Statement, f'{self.prefix}.lt_s')
|
|
self.lt_u = functools.partial(wasm.Statement, f'{self.prefix}.lt_u')
|
|
self.gt_s = functools.partial(wasm.Statement, f'{self.prefix}.gt_s')
|
|
self.gt_u = functools.partial(wasm.Statement, f'{self.prefix}.gt_u')
|
|
self.le_s = functools.partial(wasm.Statement, f'{self.prefix}.le_s')
|
|
self.le_u = functools.partial(wasm.Statement, f'{self.prefix}.le_u')
|
|
self.ge_s = functools.partial(wasm.Statement, f'{self.prefix}.ge_s')
|
|
self.ge_u = functools.partial(wasm.Statement, f'{self.prefix}.ge_u')
|
|
|
|
def const(self, value: int, comment: Optional[str] = None) -> wasm.Statement:
|
|
return wasm.Statement(f'{self.prefix}.const', f'0x{value:08x}', comment=comment)
|
|
|
|
i32 = Prefix_inn_fnn('i32')
|
|
i64 = Prefix_inn_fnn('i64')
|
|
|
|
class Block:
|
|
def __init__(self, start: str) -> None:
|
|
self.start = start
|
|
|
|
def __call__(self, *statements: wasm.Statement) -> List[wasm.Statement]:
|
|
return [
|
|
wasm.Statement('if'),
|
|
*statements,
|
|
wasm.Statement('end'),
|
|
]
|
|
|
|
if_ = Block('if')
|