summaryrefslogtreecommitdiff
path: root/src/support
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2018-02-14 08:06:52 -0800
committerGitHub <noreply@github.com>2018-02-14 08:06:52 -0800
commite97d485bb1f1818e2c2118d28507d49cb61ea57b (patch)
treee1ef9db3f9b95ba4d279ec6c421e0b1c4f2a3b22 /src/support
parent41faf2409f3e1d8d2dcaf456141f4ce6ac6a3d75 (diff)
downloadbinaryen-e97d485bb1f1818e2c2118d28507d49cb61ea57b.tar.gz
binaryen-e97d485bb1f1818e2c2118d28507d49cb61ea57b.tar.bz2
binaryen-e97d485bb1f1818e2c2118d28507d49cb61ea57b.zip
More simple math opts (#1414)
* optimize more simple math operations: mul of 0, or of 0, and of 0, mul of 1, mul of a power of 2, urem of a power of 2 * fix asm2wasm callImport parsing: the optimizer may get rid of the added offset to a function table * update js builds
Diffstat (limited to 'src/support')
-rw-r--r--src/support/bits.h7
-rw-r--r--src/support/utilities.h8
2 files changed, 10 insertions, 5 deletions
diff --git a/src/support/bits.h b/src/support/bits.h
index 1fba58bf1..73d71e804 100644
--- a/src/support/bits.h
+++ b/src/support/bits.h
@@ -29,6 +29,9 @@
*
* We instead use portable and reasonably-fast implementations, while
* avoiding implementations with large lookup tables.
+ *
+ * TODO: The convention here should be changed PopCount => popCount,
+ * initial lowercase, to match the rest of the codebase.
*/
namespace wasm {
@@ -65,6 +68,10 @@ template <typename T>
int CountLeadingZeroes(T v) {
return CountLeadingZeroes(typename std::make_unsigned<T>::type(v));
}
+template <typename T>
+bool IsPowerOf2(T v) {
+ return v != 0 && PopCount(v) == 1;
+}
template <typename T, typename U>
inline static T RotateLeft(T val, U count) {
diff --git a/src/support/utilities.h b/src/support/utilities.h
index 66e7ed797..a2fff7f0a 100644
--- a/src/support/utilities.h
+++ b/src/support/utilities.h
@@ -26,6 +26,8 @@
#include <iostream>
#include <type_traits>
+#include "support/bits.h"
+
namespace wasm {
// Type punning needs to be done through this function to avoid undefined
@@ -41,12 +43,8 @@ inline Destination bit_cast(const Source& source) {
return destination;
}
-inline bool isPowerOf2(uint32_t v) {
- return v && !(v & (v - 1));
-}
-
inline size_t alignAddr(size_t address, size_t alignment) {
- assert(alignment && isPowerOf2((uint32_t)alignment) &&
+ assert(alignment && IsPowerOf2((uint32_t)alignment) &&
"Alignment is not a power of two!");
assert(address + alignment - 1 >= address);