Consider the following (incomplete) code: enum simd { mmx = 1, sse = 2 /* , ... */ }; template<simd flags> void simd_func() { if constexpr (flags & simd::mmx) { // MMX code here } else if constexpr (flags & simd::sse) { // SSE code here } // etc ... } The idea is to instantiate function templates with optimized SIMD routines multiple times, then I can compile all my code with -march=i386, and select the best implementation at runtime. However, after already spending a lot of time restructuring my code around this idea, I discover that gcc refuses to compile this without having the corresponding target options enabled: error: inlining failed in call to 'always_inline' '__m64 _mm_unpacklo_pi8(__m64, __m64)': target specific option mismatch That makes no sense to me. I want gcc to emit those SIMD instructions verbatim in my code, regardless of what compiler options the user specified. What then is the point of feature-test macros (__SSE__, etc)? I don't get it. Is there any option or attribute I can use to make gcc ignore these target option mismatches when inlining? Or any other way to make this work?