diff --git a/arbor/include/arbor/common_types.hpp b/arbor/include/arbor/common_types.hpp
index 3741f120119c3ad596af592cf6e1a23ea743db22..de9dc376d610b09acd4f990b6ecb83e5ea766d6b 100644
--- a/arbor/include/arbor/common_types.hpp
+++ b/arbor/include/arbor/common_types.hpp
@@ -99,10 +99,24 @@ namespace std {
     template <> struct hash<arb::cell_member_type> {
         std::size_t operator()(const arb::cell_member_type& m) const {
             using namespace arb;
-            static_assert(sizeof(std::size_t)>sizeof(cell_gid_type), "invalid size assumptions for hash of cell_member_type");
-
-            std::size_t k = ((std::size_t)m.gid << (8*sizeof(cell_gid_type))) + m.index;
-            return std::hash<std::size_t>{}(k);
+            if (sizeof(std::size_t)>sizeof(cell_gid_type)) {
+                constexpr unsigned shift = 8*sizeof(cell_gid_type);
+
+                std::size_t k = m.gid;
+                k <<= (shift/2); // dodge gcc shift warning when other branch taken
+                k <<= (shift/2);
+                k += m.index;
+                return std::hash<std::size_t>{}(k);
+            }
+            else {
+                constexpr std::size_t prime1 = 93481;
+                constexpr std::size_t prime2 = 54517;
+
+                std::size_t k = prime1;
+                k = k*prime2 + m.gid;
+                k = k*prime2 + m.index;
+                return k;
+            }
         }
     };
 }
diff --git a/cmake/CompilerOptions.cmake b/cmake/CompilerOptions.cmake
index f192db72b23dd9a1d04b826102f4afb8e10e44e0..dac4325ea64f169877d72b27e2e09b5f4e02539e 100644
--- a/cmake/CompilerOptions.cmake
+++ b/cmake/CompilerOptions.cmake
@@ -91,7 +91,7 @@ function(set_arch_target optvar arch)
 
         # Use -mcpu for all supported targets _except_ for x86, where it should be -march.
 
-        if(target_model MATCHES "x86" OR target_model MATCHES "amd64" OR target_model MATCHES "aarch64")
+        if(target_model MATCHES "x86|i[3456]86" OR target_model MATCHES "amd64" OR target_model MATCHES "aarch64")
             set(arch_opt "-march=${arch}")
         else()
             set(arch_opt "-mcpu=${arch}")
diff --git a/test/unit/test_algorithms.cpp b/test/unit/test_algorithms.cpp
index 76655b79bc25df64d82c2d5ba673379526cf018b..e77e3f9978007d18d3189d0b2f31fd227f18fdba 100644
--- a/test/unit/test_algorithms.cpp
+++ b/test/unit/test_algorithms.cpp
@@ -663,7 +663,7 @@ TEST(algorithms, binary_find)
         auto ita = binary_find(a, 1);
         auto found = ita!=std::end(a);
         EXPECT_TRUE(found);
-        EXPECT_EQ(std::distance(std::begin(a), ita), 0u);
+        EXPECT_EQ(std::distance(std::begin(a), ita), 0);
         if (found) {
             EXPECT_EQ(*ita, 1);
         }
@@ -672,7 +672,7 @@ TEST(algorithms, binary_find)
         auto itv = binary_find(v, 1);
         found = itv!=std::end(v);
         EXPECT_TRUE(found);
-        EXPECT_EQ(std::distance(std::begin(v), itv), 0u);
+        EXPECT_EQ(std::distance(std::begin(v), itv), 0);
         if (found) {
             EXPECT_EQ(*itv, 1);
         }
@@ -684,7 +684,7 @@ TEST(algorithms, binary_find)
         auto ita = binary_find(a, 15);
         auto found = ita!=std::end(a);
         EXPECT_TRUE(found);
-        EXPECT_EQ(std::distance(std::begin(a), ita), 2u);
+        EXPECT_EQ(std::distance(std::begin(a), ita), 2);
         if (found) {
             EXPECT_EQ(*ita, 15);
         }
@@ -693,7 +693,7 @@ TEST(algorithms, binary_find)
         auto itv = binary_find(v, 15);
         found = itv!=std::end(v);
         EXPECT_TRUE(found);
-        EXPECT_EQ(std::distance(std::begin(v), itv), 2u);
+        EXPECT_EQ(std::distance(std::begin(v), itv), 2);
         if (found) {
             EXPECT_EQ(*itv, 15);
         }
@@ -705,7 +705,7 @@ TEST(algorithms, binary_find)
         auto ita = binary_find(a, 10);
         auto found = ita!=std::end(a);
         EXPECT_TRUE(found);
-        EXPECT_EQ(std::distance(std::begin(a), ita), 1u);
+        EXPECT_EQ(std::distance(std::begin(a), ita), 1);
         if (found) {
             EXPECT_EQ(*ita, 10);
         }
@@ -714,7 +714,7 @@ TEST(algorithms, binary_find)
         auto itv = binary_find(v, 10);
         found = itv!=std::end(v);
         EXPECT_TRUE(found);
-        EXPECT_EQ(std::distance(std::begin(v), itv), 1u);
+        EXPECT_EQ(std::distance(std::begin(v), itv), 1);
         if (found) {
             EXPECT_EQ(*itv, 10);
         }
@@ -726,7 +726,7 @@ TEST(algorithms, binary_find)
         auto ita = binary_find(a, 10);
         auto found = ita!=std::end(a);
         EXPECT_TRUE(found);
-        EXPECT_EQ(std::distance(std::begin(a), ita), 1u);
+        EXPECT_EQ(std::distance(std::begin(a), ita), 1);
         if (found) {
             EXPECT_EQ(*ita, 10);
         }
@@ -735,7 +735,7 @@ TEST(algorithms, binary_find)
         auto itv = binary_find(v, 10);
         found = itv!=std::end(v);
         EXPECT_TRUE(found);
-        EXPECT_EQ(std::distance(std::begin(v), itv), 1u);
+        EXPECT_EQ(std::distance(std::begin(v), itv), 1);
         if (found) {
             EXPECT_EQ(*itv, 10);
         }
@@ -750,7 +750,7 @@ TEST(algorithms, binary_find)
         auto itv = binary_find(vr, 10);
         auto found = itv!=std::end(vr);
         EXPECT_TRUE(found);
-        EXPECT_EQ(std::distance(std::cbegin(v), itv), 1u);
+        EXPECT_EQ(std::distance(std::cbegin(v), itv), 1);
         if (found) {
             EXPECT_EQ(*itv, 10);
         }
diff --git a/test/unit/test_simd.cpp b/test/unit/test_simd.cpp
index 36bc74b3559d9fcddab64348cba853923367380f..47c701c755a589eec2af762c1ba45a77bb77d0ac 100644
--- a/test/unit/test_simd.cpp
+++ b/test/unit/test_simd.cpp
@@ -664,7 +664,7 @@ TYPED_TEST_P(simd_fp_value, fp_maths) {
 
         fp exprelr_u[N];
         for (unsigned i = 0; i<N; ++i) {
-            exprelr_u[i] = u[i]+fp(1)==fp(1)? fp(1): u[i]/(std::exp(u[i])-fp(1));
+            exprelr_u[i] = u[i]+fp(1)==fp(1)? fp(1): u[i]/(std::expm1(u[i]));
         }
         exprelr(simd(u)).copy_to(r);
         EXPECT_TRUE(testing::seq_almost_eq<fp>(exprelr_u, r));