From: Michael R. Crusoe <crusoe@debian.org>
Subject: Fix use of some intrinsics when compiling for SSE2 only
--- gmap.orig/src/intersect-simd.c
+++ gmap/src/intersect-simd.c
@@ -238,9 +238,12 @@
   maxFreq = freq[2 * 4 - 1];
 #ifdef HAVE_AVX2
   F = _mm256_loadu_si256((const __m256i *)(freq));
-#else
+#elif defined(HAVE_SSSE3)  // Actually SSE3
   F0 = _mm_lddqu_si128((const __m128i *)(freq));
   F1 = _mm_lddqu_si128((const __m128i *)(freq + 4));
+#else 
+  F0 = _mm_loadu_si128((const __m128i *)(freq));
+  F1 = _mm_loadu_si128((const __m128i *)(freq + 4));
 #endif
 
   if (COMPILER_RARELY(maxFreq < valRare))
@@ -281,8 +284,13 @@
     if (_mm_movemask_epi8(F0)) {
       matchOut++;
     }
+#ifdef HAVE_SSSE3  // Actually SSE3
     F0 = _mm_lddqu_si128((const __m128i *)(freq));
     F1 = _mm_lddqu_si128((const __m128i *)(freq + 4));
+#else
+    F0 = _mm_loadu_si128((const __m128i *)(freq));
+    F1 = _mm_loadu_si128((const __m128i *)(freq + 4));
+#endif
 #endif
 
   } while (maxFreq >= valRare);
@@ -305,9 +313,12 @@
 
 #ifdef HAVE_AVX2
   F = _mm256_loadu_si256((const __m256i *)(freq));
-#else
+#elif defined(HAVE_SSSE3)  // Actually SSE3
   F0 = _mm_lddqu_si128((const __m128i *)(freq));
   F1 = _mm_lddqu_si128((const __m128i *)(freq + 4));
+#else 
+  F0 = _mm_loadu_si128((const __m128i *)(freq));
+  F1 = _mm_loadu_si128((const __m128i *)(freq + 4));
 #endif
 
   goto ADVANCE_RARE;
--- gmap.orig/src/intersect-uint2.c
+++ gmap/src/intersect-uint2.c
@@ -30,7 +30,7 @@
 #endif
 
 
-#if !defined(HAVE_STTNI)
+#if !defined(HAVE_STTNI) || !defined(HAVE_SSE4_2)
 
 static int
 intersect_vector16 (const uint16_t *A, const uint16_t *B,
@@ -369,8 +369,11 @@
 
   if ((i_a < st_a) && (i_b < st_b)) {
     v_a = _mm_loadu_si128((const __m128i *) &A[i_a]);
+#if defined(HAVE_SSSE3)  // Actually SSE3
     v_b = _mm_lddqu_si128((const __m128i *) &B[i_b]);
-
+#else
+    v_b = _mm_loadu_si128((const __m128i *) &B[i_b]);
+#endif
     while ((A[i_a] == 0) || (B[i_b] == 0)) {
       const __m128i res_v =
           _mm_cmpestrm(v_b, 8, v_a, 8,
@@ -396,7 +399,11 @@
         if (i_b == st_b) {
           break;
 	}
+#if defined(HAVE_SSSE3)  // Actually SSE3
         v_b = _mm_lddqu_si128((const __m128i *) &B[i_b]);
+#else
+        v_b = _mm_loadu_si128((const __m128i *) &B[i_b]);
+#endif
       }
     }
 
@@ -424,7 +431,11 @@
           if (i_b == st_b) {
             break;
 	  }
+#if defined(HAVE_SSSE3)  // Actually SSE3
           v_b = _mm_lddqu_si128((const __m128i *) &B[i_b]);
+#else
+          v_b = _mm_loadu_si128((const __m128i *) &B[i_b]);
+#endif
         }
       }
   }
--- gmap.orig/src/genomebits.h
+++ gmap/src/genomebits.h
@@ -329,7 +329,7 @@
     return 64 + (int) _lzcnt_u64(_mm_extract_epi64(_diff,0));
   }
 
-#elif defined(HAVE_MM_EXTRACT_EPI64)
+#elif defined(HAVE_MM_EXTRACT_EPI64) && defined(HAVE_SSE4_1)
   UINT8 x;
 
   if ((x = _mm_extract_epi64(_diff,1)) != 0) {
@@ -375,7 +375,7 @@
     return 64 + (int) _tzcnt_u64(_mm_extract_epi64(_diff,1));
   }
 
-#elif defined(HAVE_MM_EXTRACT_EPI64)
+#elif defined(HAVE_MM_EXTRACT_EPI64) && defined(HAVE_SSE4_1)
   UINT8 x;
 
   if ((x = _mm_extract_epi64(_diff,0)) != 0) {
