Skip to content

Commit

Permalink
Implement f{32,64}_div instructions
Browse files Browse the repository at this point in the history
  • Loading branch information
chfast committed Aug 11, 2020
1 parent 85e4b84 commit 6435f60
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 deletions.
12 changes: 10 additions & 2 deletions lib/fizzy/execute.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1526,12 +1526,22 @@ ExecutionResult execute(Instance& instance, FuncIdx func_idx, span<const Value>
binary_op(stack, std::plus<float>{});
break;
}
case Instr::f32_div:
{
binary_op(stack, std::divides<float>{});
break;
}

case Instr::f64_add:
{
binary_op(stack, std::plus<double>{});
break;
}
case Instr::f64_div:
{
binary_op(stack, std::divides<double>{});
break;
}

case Instr::i32_wrap_i64:
{
Expand Down Expand Up @@ -1671,7 +1681,6 @@ ExecutionResult execute(Instance& instance, FuncIdx func_idx, span<const Value>
case Instr::f32_sqrt:
case Instr::f32_sub:
case Instr::f32_mul:
case Instr::f32_div:
case Instr::f32_min:
case Instr::f32_max:
case Instr::f32_copysign:
Expand All @@ -1684,7 +1693,6 @@ ExecutionResult execute(Instance& instance, FuncIdx func_idx, span<const Value>
case Instr::f64_sqrt:
case Instr::f64_sub:
case Instr::f64_mul:
case Instr::f64_div:
case Instr::f64_min:
case Instr::f64_max:
case Instr::f64_copysign:
Expand Down
45 changes: 45 additions & 0 deletions test/unittests/execute_floating_point_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ TYPED_TEST(execute_floating_point_types, binop_nan_propagation)
// Only f32 variants, but f64 variants are going to be covered as well.
constexpr Instr opcodes[] = {
Instr::f32_add,
Instr::f32_div,
};

for (const auto op : opcodes)
Expand Down Expand Up @@ -363,6 +364,50 @@ TYPED_TEST(execute_floating_point_types, add)
EXPECT_THAT(exec(TypeParam{0x0.287p2}, TypeParam{0x1.FFp4}), Result(TypeParam{0x1.048Ep5}));
}

TYPED_TEST(execute_floating_point_types, div)
{
using FP = FP<TypeParam>;
using Limits = typename FP::Limits;

auto instance = instantiate(parse(this->get_binop_code(Instr::f32_div)));
const auto exec = [&](auto arg1, auto arg2) { return execute(*instance, 0, {arg1, arg2}); };

EXPECT_THAT(exec(Limits::infinity(), Limits::infinity()), CanonicalNaN(TypeParam{}));
EXPECT_THAT(exec(Limits::infinity(), -Limits::infinity()), CanonicalNaN(TypeParam{}));
EXPECT_THAT(exec(-Limits::infinity(), Limits::infinity()), CanonicalNaN(TypeParam{}));
EXPECT_THAT(exec(-Limits::infinity(), -Limits::infinity()), CanonicalNaN(TypeParam{}));

EXPECT_THAT(exec(TypeParam{0.0}, TypeParam{0.0}), CanonicalNaN(TypeParam{}));
EXPECT_THAT(exec(TypeParam{0.0}, -TypeParam{0.0}), CanonicalNaN(TypeParam{}));
EXPECT_THAT(exec(-TypeParam{0.0}, TypeParam{0.0}), CanonicalNaN(TypeParam{}));
EXPECT_THAT(exec(-TypeParam{0.0}, -TypeParam{0.0}), CanonicalNaN(TypeParam{}));

for (const auto q : this->q_values)
{
EXPECT_THAT(exec(Limits::infinity(), q), Result(Limits::infinity()));
EXPECT_THAT(exec(-Limits::infinity(), -q), Result(Limits::infinity()));
EXPECT_THAT(exec(Limits::infinity(), -q), Result(-Limits::infinity()));
EXPECT_THAT(exec(-Limits::infinity(), q), Result(-Limits::infinity()));

EXPECT_THAT(exec(q, Limits::infinity()), Result(TypeParam{0.0}));
EXPECT_THAT(exec(-q, -Limits::infinity()), Result(TypeParam{0.0}));
EXPECT_THAT(exec(-q, Limits::infinity()), Result(-TypeParam{0.0}));
EXPECT_THAT(exec(q, -Limits::infinity()), Result(-TypeParam{0.0}));

EXPECT_THAT(exec(TypeParam{0.0}, q), Result(TypeParam{0.0}));
EXPECT_THAT(exec(-TypeParam{0.0}, -q), Result(TypeParam{0.0}));
EXPECT_THAT(exec(-TypeParam{0.0}, q), Result(-TypeParam{0.0}));
EXPECT_THAT(exec(TypeParam{0.0}, -q), Result(-TypeParam{0.0}));

EXPECT_THAT(exec(q, TypeParam{0.0}), Result(Limits::infinity()));
EXPECT_THAT(exec(-q, -TypeParam{0.0}), Result(Limits::infinity()));
EXPECT_THAT(exec(q, -TypeParam{0.0}), Result(-Limits::infinity()));
EXPECT_THAT(exec(-q, TypeParam{0.0}), Result(-Limits::infinity()));
}

EXPECT_THAT(exec(TypeParam{0xABCD.01p7}, TypeParam{4}), Result(TypeParam{0x1.579A02p20}));
}


template <typename SrcT, typename DstT>
struct ConversionPairWasmTraits;
Expand Down

0 comments on commit 6435f60

Please sign in to comment.