summaryrefslogtreecommitdiff
path: root/src/wasm/literal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/literal.cpp')
-rw-r--r--src/wasm/literal.cpp38
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));
}
}