Compile out GroupVarint on non-Intel
authorOwen Yamauchi <oyamauchi@fb.com>
Thu, 21 Mar 2013 19:13:39 +0000 (12:13 -0700)
committerOwen Yamauchi <oyamauchi@fb.com>
Wed, 27 Mar 2013 21:40:17 +0000 (14:40 -0700)
Summary:
Compile out instead of erroring.

In an ideal world, we'd have a fallback that would work across platforms
(i.e. no SSE, no unaligned 32-bit writes etc.) and compile some version
of GroupVarint in all environments. I actually tried this; the SSE stuff
is all behind #if __SSSE3__ already, so I thought it could work (modulo
the unaligned-writes problem). I ran into problems with the
SSSE3-vs.-not distinction that @simpkins alluded to in D652764, and
decided I'd rather not open that can of worms at the moment.

Test Plan:
fbmake runtests. Manually force the #ifs to false and make
sure fbmake runtests still passes (although GroupVarintTest is empty).

Reviewed By: delong.j@fb.com

FB internal diff: D747150

folly/GroupVarint.cpp
folly/GroupVarint.h
folly/build/generate_varint_tables.py
folly/test/GroupVarintTest.cpp

index 2b5462459065218a07813c944b61ae058d34ca57..2ff34368bc0a6d99ec6dafe1657bfc5ee47aae93 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "folly/GroupVarint.h"
 
+#if HAVE_GROUP_VARINT
 namespace folly {
 
 const uint32_t GroupVarint32::kMask[] = {
@@ -29,4 +30,4 @@ const uint64_t GroupVarint64::kMask[] = {
 };
 
 }  // namespace folly
-
+#endif
index e3b452ae8f5ddfd52eef771602ef706ba7a395ee..dc26919547da4f9fe5217408ef2c1e3ed9849a04 100644 (file)
@@ -21,9 +21,8 @@
 #error GroupVarint.h requires GCC
 #endif
 
-#if !defined(__x86_64__) && !defined(__i386__)
-#error GroupVarint.h requires x86_64 or i386
-#endif
+#if defined(__x86_64__) || defined(__i386__)
+#define HAVE_GROUP_VARINT 1
 
 #include <cstdint>
 #include <limits>
@@ -604,5 +603,6 @@ typedef GroupVarintDecoder<uint64_t> GroupVarint64Decoder;
 
 }  // namespace folly
 
+#endif /* defined(__x86_64__) || defined(__i386__) */
 #endif /* FOLLY_GROUPVARINT_H_ */
 
index 55375d2ff52812199cc464110e17d6d8cb038e2c..19589edc8b680311e71b73a07ed9dcd0de1fd52d 100755 (executable)
@@ -51,13 +51,16 @@ from optparse import OptionParser
 OUTPUT_FILE = "GroupVarintTables.cpp"
 
 def generate(f):
-    f.write("#include <stdint.h>\n"
-            "#include <x86intrin.h>\n"
-            "\n"
-            "namespace folly {\n"
-            "namespace detail {\n"
-            "\n"
-            "extern const __m128i groupVarintSSEMasks[] = {\n")
+    f.write("""
+#if defined(__x86_64__) || defined(__i386__)
+#include <stdint.h>
+#include <x86intrin.h>
+
+namespace folly {
+namespace detail {
+
+extern const __m128i groupVarintSSEMasks[] = {
+""")
 
     # Compute SSE masks
     for i in range(0, 256):
@@ -88,10 +91,13 @@ def generate(f):
             offset += d
         f.write("  {0},\n".format(offset))
 
-    f.write("};\n"
-            "\n"
-            "}  // namespace detail\n"
-            "}  // namespace folly\n")
+    f.write("""
+};
+
+}  // namespace detail
+}  // namespace folly
+#endif /* defined(__x86_64__) || defined(__i386__) */
+""")
 
 def main():
     parser = OptionParser()
index 1e59016dd3d735c5096e6d0c2924a3b34682349e..32b4ae8f3502b73f07354f7280be20f6e967693d 100644 (file)
@@ -17,6 +17,9 @@
 #include <stdarg.h>
 #include "folly/GroupVarint.h"
 
+// On platforms where it's not supported, GroupVarint will be compiled out.
+#if HAVE_GROUP_VARINT
+
 #include <gtest/gtest.h>
 
 using namespace folly;
@@ -259,3 +262,4 @@ TEST(GroupVarint, GroupVarintDecoder) {
   }
 }
 
+#endif