Current section

Files

Jump to
orb lib orb f32.ex
Raw

lib/orb/f32.ex

defmodule Orb.F32 do
@moduledoc false
require Orb.Ops, as: Ops
alias Orb.Instruction
@behaviour Orb.CustomType
@impl Orb.CustomType
def wasm_type(), do: :f32
@impl Orb.CustomType
def byte_count(), do: 4
for op <- Ops.f32(1) do
def unquote(op)(a) do
Instruction.f32(unquote(op), a)
end
end
for op <- Ops.f32(2) do
def unquote(op)(a, b) do
Instruction.f32(unquote(op), a, b)
end
end
defmacro global(mutability \\ :mutable, list)
when mutability in ~w{readonly mutable}a do
quote do
@wasm_globals (for {key, value} <- unquote(list) do
Orb.Global.new(
:f32,
key,
unquote(mutability),
:internal,
{:f32_const, value}
)
end)
end
end
defmacro export_global(mutability, list)
when mutability in ~w{readonly mutable}a do
quote do
@wasm_globals (for {key, value} <- unquote(list) do
Orb.Global.new(
:f32,
key,
unquote(mutability),
:exported,
{:f32_const, value}
)
end)
end
end
defmodule DSL do
@moduledoc """
32-bit float operators.
"""
import Kernel, except: [+: 2, -: 2, *: 2, ===: 2, !==: 2, /: 2, <=: 2, >=: 2]
def left + right do
Instruction.f32(:add, left, right)
end
def left - right do
Instruction.f32(:sub, left, right)
end
def left * right do
Instruction.f32(:mul, left, right)
end
def left / right do
Instruction.f32(:div, left, right)
end
def _left == _right do
raise "== is not supported in Orb. Use === instead."
end
def _left != _right do
raise "!= is not supported in Orb. Use !== instead."
end
def left === right do
Instruction.f32(:eq, left, right)
end
def left !== right do
Instruction.f32(:ne, left, right)
end
def left < right do
Instruction.f32(:lt, left, right)
end
def left > right do
Instruction.f32(:gt, left, right)
end
def left <= right do
Instruction.f32(:le, left, right)
end
def left >= right do
Instruction.f32(:ge, left, right)
end
end
end