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
#include "folly/GroupVarint.h"
+#if HAVE_GROUP_VARINT
namespace folly {
const uint32_t GroupVarint32::kMask[] = {
};
} // namespace folly
-
+#endif
#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>
} // namespace folly
+#endif /* defined(__x86_64__) || defined(__i386__) */
#endif /* FOLLY_GROUPVARINT_H_ */
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):
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()
#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;
}
}
+#endif