diff options
Diffstat (limited to 'src/wasm/literal.cpp')
-rw-r--r-- | src/wasm/literal.cpp | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index f42727aeb..360b514c5 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -127,16 +127,34 @@ Literal::Literal(const LaneArray<2>& lanes) : type(Type::v128) { extractBytes<uint64_t, 2>(v128, lanes); } -Literals Literal::makeZero(Type type) { +Literals Literal::makeZeros(Type type) { assert(type.isConcrete()); Literals zeroes; for (const auto& t : type) { - zeroes.push_back(makeSingleZero(t)); + zeroes.push_back(makeZero(t)); } return zeroes; } -Literal Literal::makeSingleZero(Type type) { +Literals Literal::makeOnes(Type type) { + assert(type.isConcrete()); + Literals units; + for (const auto& t : type) { + units.push_back(makeOne(t)); + } + return units; +} + +Literals Literal::makeNegOnes(Type type) { + assert(type.isConcrete()); + Literals units; + for (const auto& t : type) { + units.push_back(makeNegOne(t)); + } + return units; +} + +Literal Literal::makeZero(Type type) { assert(type.isSingle()); if (type.isRef()) { if (type == Type::i31ref) { @@ -149,6 +167,16 @@ Literal Literal::makeSingleZero(Type type) { } } +Literal Literal::makeOne(Type type) { + assert(type.isNumber()); + return makeFromInt32(1, type); +} + +Literal Literal::makeNegOne(Type type) { + assert(type.isNumber()); + return makeFromInt32(-1, type); +} + std::array<uint8_t, 16> Literal::getv128() const { assert(type == Type::v128); std::array<uint8_t, 16> ret; @@ -1705,7 +1733,7 @@ template<int Lanes, LaneArray<Lanes> (Literal::*IntoLanes)() const> static Literal any_true(const Literal& val) { LaneArray<Lanes> lanes = (val.*IntoLanes)(); for (size_t i = 0; i < Lanes; ++i) { - if (lanes[i] != Literal::makeSingleZero(lanes[i].type)) { + if (lanes[i] != Literal::makeZero(lanes[i].type)) { return Literal(int32_t(1)); } } @@ -1716,7 +1744,7 @@ template<int Lanes, LaneArray<Lanes> (Literal::*IntoLanes)() const> static Literal all_true(const Literal& val) { LaneArray<Lanes> lanes = (val.*IntoLanes)(); for (size_t i = 0; i < Lanes; ++i) { - if (lanes[i] == Literal::makeSingleZero(lanes[i].type)) { + if (lanes[i] == Literal::makeZero(lanes[i].type)) { return Literal(int32_t(0)); } } |