Packages
orb
0.2.0
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
0.0.51
0.0.49
0.0.48
0.0.47
0.0.46
0.0.45
0.0.44
0.0.43
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
retired
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
DSL for WebAssembly
Current section
Files
Jump to
Current section
Files
lib/orb/numeric/multiply.ex
defmodule Orb.Numeric.Multiply do
@moduledoc """
WebAssembly numeric `mul` instruction:
- `i32.mul`
- `i64.mul`
- `f32.mul`
- `f64.mul`
[MDN reference](https://developer.mozilla.org/en-US/docs/WebAssembly/Reference/Numeric/Multiplication)
"""
alias Orb.CustomType
alias require Orb.Ops
# Perform at comptime.
def optimized(_type, a, b) when is_integer(a) and is_integer(b), do: a * b
# Multiply anything by zero equals zero.
def optimized(type, _, 0), do: Orb.Instruction.wrap_constant!(type, 0)
def optimized(type, 0, _), do: Orb.Instruction.wrap_constant!(type, 0)
# Multiply one by anything is that same thing.
def optimized(_type, a, 1), do: a
def optimized(_type, 1, b), do: b
# Finally, spit out the runtime instruction.
def optimized(type, a, b) when Ops.is_primitive_type(type),
do: Orb.Instruction.new(type, :mul, [a, b])
def optimized(type, a, b), do: Orb.Instruction.new(CustomType.resolve!(type), :mul, [a, b])
end