Move folly::compression::Instructions to a separate file
authorVignesh Gowda <vigneshgowda@fb.com>
Thu, 18 Jun 2015 17:00:51 +0000 (10:00 -0700)
committerSara Golemon <sgolemon@fb.com>
Fri, 19 Jun 2015 02:30:12 +0000 (19:30 -0700)
Summary: Moved abstraction layer for platform-specific bit-manipulation instructions from the EliasFanoCoding.h to Instructions.h since we will need to use it also for BitVectors:

Reviewed By: @ot

Differential Revision: D2165314

folly/Makefile.am
folly/experimental/EliasFanoCoding.h
folly/experimental/Instructions.h [new file with mode: 0644]

index bdfbe6d541a3c58baab2858f7590fea7d415446b..9b1c9e0ae30ba20531ae36b5f2bccbe69a5e4772 100644 (file)
@@ -77,6 +77,7 @@ nobase_follyinclude_HEADERS = \
        experimental/ExecutionObserver.h \
        experimental/EliasFanoCoding.h \
        experimental/EventCount.h \
+       experimental/Instructions.h \
        experimental/fibers/AddTasks.h \
        experimental/fibers/AddTasks-inl.h \
        experimental/fibers/Baton.h \
index 3d85bf3d60d212f0577f7db5c9e3ef6e04e5225b..f5fcfe860f3685303fa665ca4234f6d59a3db83f 100644 (file)
@@ -34,8 +34,8 @@
 #include <folly/Likely.h>
 #include <folly/Portability.h>
 #include <folly/Range.h>
+#include <folly/experimental/Instructions.h>
 #include <folly/experimental/Select64.h>
-
 #ifndef __GNUC__
 #error EliasFanoCoding.h requires GCC
 #endif
@@ -329,62 +329,6 @@ struct EliasFanoEncoderV2<Value,
   size_t forwardPointers = 0;
 };
 
-// NOTE: It's recommended to compile EF coding with -msse4.2, starting
-// with Nehalem, Intel CPUs support POPCNT instruction and gcc will emit
-// it for __builtin_popcountll intrinsic.
-// But we provide an alternative way for the client code: it can switch to
-// the appropriate version of EliasFanoReader<> in realtime (client should
-// implement this switching logic itself) by specifying instruction set to
-// use explicitly.
-namespace instructions {
-
-struct Default {
-  static bool supported(const folly::CpuId& cpuId = {}) {
-    return true;
-  }
-  static inline uint64_t popcount(uint64_t value) {
-    return __builtin_popcountll(value);
-  }
-  static inline int ctz(uint64_t value) {
-    DCHECK_GT(value, 0);
-    return __builtin_ctzll(value);
-  }
-  static inline int clz(uint64_t value) {
-    DCHECK_GT(value, 0);
-    return __builtin_clzll(value);
-  }
-  static inline uint64_t blsr(uint64_t value) {
-    return value & (value - 1);
-  }
-};
-
-struct Nehalem : public Default {
-  static bool supported(const folly::CpuId& cpuId = {}) {
-    return cpuId.popcnt();
-  }
-  static inline uint64_t popcount(uint64_t value) {
-    // POPCNT is supported starting with Intel Nehalem, AMD K10.
-    uint64_t result;
-    asm ("popcntq %1, %0" : "=r" (result) : "r" (value));
-    return result;
-  }
-};
-
-struct Haswell : public Nehalem {
-  static bool supported(const folly::CpuId& cpuId = {}) {
-    return Nehalem::supported(cpuId) && cpuId.bmi1();
-  }
-  static inline uint64_t blsr(uint64_t value) {
-    // BMI1 is supported starting with Intel Haswell, AMD Piledriver.
-    // BLSR combines two instuctions into one and reduces register pressure.
-    uint64_t result;
-    asm ("blsrq %1, %0" : "=r" (result) : "r" (value));
-    return result;
-  }
-};
-
-}  // namespace instructions
-
 namespace detail {
 
 template <class Encoder, class Instructions>
diff --git a/folly/experimental/Instructions.h b/folly/experimental/Instructions.h
new file mode 100644 (file)
index 0000000..694e1f5
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2015 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef FOLLY_EXPERIMENTAL_INSTRUCTIONS_H
+#define FOLLY_EXPERIMENTAL_INSTRUCTIONS_H
+
+namespace folly { namespace compression { namespace instructions {
+
+// NOTE: It's recommended to compile EF coding with -msse4.2, starting
+// with Nehalem, Intel CPUs support POPCNT instruction and gcc will emit
+// it for __builtin_popcountll intrinsic.
+// But we provide an alternative way for the client code: it can switch to
+// the appropriate version of EliasFanoReader<> in realtime (client should
+// implement this switching logic itself) by specifying instruction set to
+// use explicitly.
+
+struct Default {
+  static bool supported(const folly::CpuId& cpuId = {}) {
+    return true;
+  }
+  static inline uint64_t popcount(uint64_t value) {
+    return __builtin_popcountll(value);
+  }
+  static inline int ctz(uint64_t value) {
+    DCHECK_GT(value, 0);
+    return __builtin_ctzll(value);
+  }
+  static inline int clz(uint64_t value) {
+    DCHECK_GT(value, 0);
+    return __builtin_clzll(value);
+  }
+  static inline uint64_t blsr(uint64_t value) {
+    return value & (value - 1);
+  }
+};
+
+struct Nehalem : public Default {
+  static bool supported(const folly::CpuId& cpuId = {}) {
+    return cpuId.popcnt();
+  }
+  static inline uint64_t popcount(uint64_t value) {
+    // POPCNT is supported starting with Intel Nehalem, AMD K10.
+    uint64_t result;
+    asm ("popcntq %1, %0" : "=r" (result) : "r" (value));
+    return result;
+  }
+};
+
+struct Haswell : public Nehalem {
+  static bool supported(const folly::CpuId& cpuId = {}) {
+    return Nehalem::supported(cpuId) && cpuId.bmi1();
+  }
+  static inline uint64_t blsr(uint64_t value) {
+    // BMI1 is supported starting with Intel Haswell, AMD Piledriver.
+    // BLSR combines two instuctions into one and reduces register pressure.
+    uint64_t result;
+    asm ("blsrq %1, %0" : "=r" (result) : "r" (value));
+    return result;
+  }
+};
+
+}}}  // namespaces
+
+#endif  // FOLLY_EXPERIMENTAL_INSTRUCTIONS_H