Before getting to the intrinsics themselves, it is important to mention why you should prefer using intrinsics when it is possible for you to use inline assembly (inline asm) to access the instructions directly. Here are some reasons to consider using the intrinsics:
Now let's get back to the new intrinsics. For the most part, these functions provide support for the Supplemental Streaming SIMD Extensions 3 (SSSE3), Streaming SIMD Extensions 4.1 (SSE4.1), SSE4.2, and SSE4A intrinsics. A handful of instructions were also created to support advanced bit manipulation instructions not available on earlier chipsets. All of these new intrinsics are first supported by the Penryn and Nehalem architectures for Intel and the Third-Generation AMD Opteron processors for AMD. However, regardless of your processor, you should always verify that a given intrinsic is supported before you attempt to use it. Not doing so could result in a run-time error.
To facilitate this verification process, the CPUID instruction has been updated. The latest copy of the documentation for Visual Studio 2008 contains a sample program in the topic __cpuid that you can copy, compile, and use. It is currently up to date and prints out in plain text what technologies your processor supports.
All of the intrinsics are straightforward and have documentation as well as code samples. Take a look. Tables for the new intrinsics can be found in the following three topics: SSE4A and Advanced Bit Manipulation Intrinsics, Streaming SIMD Extensions 4 Instructions, and Supplemental Streaming SIMD Extensions 3 Instructions.
Here is a list of the new intrinsics, organized by the instruction they support. Several of the instructions are very similar and only differ based on the size of the input parameters. To save space, these instructions are listed together. The one unusual case that bears some special consideration is POPCNT. This is listed both under SSE4.2 and ABM. This is so that the intrinsics are compatible with both the AMD and Intel compilers.
How hard is it to implement inline assembly and support all instruction sets ?
Once, i had to use SSSe3 with VS.NET2003 and the solution i found was __asm emit xxxxx . But that is pretty uncomfortable. This is very disappointing....