43using VMode = std::variant<Mode, nat_t, const Def*>;
47 if (
auto def = std::get_if<const Def*>(&m))
return *def;
48 if (
auto nat = std::get_if<nat_t>(&m))
return w.lit_nat(*nat);
49 return w.lit_nat(std::to_underlying(std::get<Mode>(m)));
56 World& w = pe->world();
57 return w.app(w.annex<
F>(), pe);
60 auto lp = w.lit_nat(p);
61 auto le = w.lit_nat(
e);
62 return type_f(w.tuple({lp, le}));
64template<nat_t P, nat_t E>
67 auto [p,
e] = f_ty->arg()->projs<2>([](
auto op) {
return Lit::isa(op); });
68 if (p &&
e && *p == P && *
e == E)
return f_ty;
77inline std::optional<nat_t>
isa_f(
const Def* def) {
79 if (
auto [p,
e] = f_ty->arg()->projs<2>([](
auto op) { return Lit::isa(op); }); p &&
e) {
80 if (*p == 10 &&
e == 5)
return 16;
81 if (*p == 23 &&
e == 8)
return 32;
82 if (*p == 52 &&
e == 11)
return 64;
91 static_assert(std::is_floating_point_v<R>);
93 else if constexpr (
sizeof(R) == 2)
return w.lit(w.annex<
F16>(), std::bit_cast<u16>(val));
94 else if constexpr (
sizeof(R) == 4)
return w.lit(w.annex<
F32>(), std::bit_cast<u32>(val));
95 else if constexpr (
sizeof(R) == 8)
return w.lit(w.annex<
F64>(), std::bit_cast<u64>(val));
96 else fe::unreachable();
101#if defined(__STDCPP_FLOAT16_T__)
102 case 16: assert(
mim::f64(mim::f16(val)) == val &&
"loosing precision");
return lit_f(w, mim::f16(val));
106 default:
return nullptr;
116 auto s =
isa_f(
a->type());
117 if (!s)
return nullptr;
140template<>
struct fe::is_bit_enum<
mim::plug::math::Mode> : std::true_type {};
static auto isa(const Def *def)
static std::optional< T > isa(const Def *def)
The World represents the whole program and manages creation of MimIR nodes (Defs).
const Lit * lit_f(World &w, R val)
const Def * type_f(const Def *pe)
auto match_f(const Def *def)
Mode
Allowed optimizations for a specific operation.
@ none
Alias for Mode::none.
@ afn
Approximate functions.
@ unsafe
Mode::nsz | Mode::arcp | Mode::reassoc.
@ reassoc
Allow reassociation transformations for floating-point operations.
@ contract
Allow floating-point contraction (e.g.
@ finite
Mode::nnan | Mode::ninf.
@ bot
Alias for Mode::fast.
const Def * mode(World &w, VMode m)
mim::plug::math::VMode -> const Def*.
std::variant< Mode, nat_t, const Def * > VMode
Give Mode as mim::plug::math::Mode, mim::nat_t or const Def*.
auto match_f16(const Def *def)
std::optional< nat_t > isa_f(const Def *def)
const Def * op_rminus(VMode m, const Def *a)
auto match_f64(const Def *def)
auto match_f32(const Def *def)
constexpr bool is_commutative(Id)
constexpr bool is_associative(Id id)