int sse_level() {
  int level = -1;
  int a, b, c, d;
  __asm__ __volatile__(
      "         movl %%ebx, %%edi;         cpuid;		          movl "
      "%%ebx, %1;	          movl %%edi, %%ebx"
      : "=a"(a), "=r"(b), "=c"(c), "=d"(d)
      : "a"(1)
      : "edi");
  ;
  if (d & (1L << 25)) {
    level = 1;
  }
  if (d & (1L << 26)) {
    level = 2;
  }
  if (c & (1L << 0)) {
    level = 3;
  }
  return level;
}


x86 assembly (clang, -O0):
<sse_level>:
push   %rbp
mov    %rsp,%rbp
movl   $0xffffffff,-0x4(%rbp)
mov    $0x1,%eax
mov    %ebx,%edi
cpuid
mov    %ebx,%esi
mov    %edi,%ebx
mov    %esi,-0x18(%rbp)
mov    %eax,%esi
mov    -0x18(%rbp),%eax
mov    %esi,-0x8(%rbp)
mov    %eax,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movslq -0x14(%rbp),%rax
and    $0x2000000,%rax
cmp    $0x0,%rax
je     1147 <sse_level+0x47>
movl   $0x1,-0x4(%rbp)
movslq -0x14(%rbp),%rax
and    $0x4000000,%rax
cmp    $0x0,%rax
je     1162 <sse_level+0x62>
movl   $0x2,-0x4(%rbp)
movslq -0x10(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     117b <sse_level+0x7b>
movl   $0x3,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<sse_level>:
mov    $0x1,%eax
mov    %ebx,%edi
cpuid
mov    %ebx,%esi
mov    %edi,%ebx
mov    %edx,%eax
mov    %eax,%edx
and    $0x2000000,%edx
cmp    $0x1,%rdx
sbb    %edx,%edx
or     $0x1,%edx
test   $0x4000000,%eax
mov    $0x2,%esi
cmove  %edx,%esi
test   $0x1,%cl
mov    $0x3,%eax
cmove  %esi,%eax
ret

LLVM IR (-O0):
define i32 @sse_level() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i32 -1, i32* %1
%6 = call { i32, i32, i32, i32 } asm sideeffect " movl %ebx, %edi; cpuid;\09\09 movl %ebx, $1;\09 movl %edi, %ebx", "={ax},=r,={cx},={dx},{ax},~{edi},~{dirflag},~{fpsr},~{flags}"(i32 1)
%7 = extractvalue { i32, i32, i32, i32 } %6, 0
%8 = extractvalue { i32, i32, i32, i32 } %6, 1
%9 = extractvalue { i32, i32, i32, i32 } %6, 2
%10 = extractvalue { i32, i32, i32, i32 } %6, 3
store i32 %7, i32* %2
store i32 %8, i32* %3
store i32 %9, i32* %4
store i32 %10, i32* %5
%11 = load i32, i32* %5
%12 = sext i32 %11 to i64
%13 = and i64 %12, 33554432
%14 = icmp ne i64 %13, 0
br i1 %14, label %15, label %16
15: ; preds = %0
store i32 1, i32* %1
br label %16
16: ; preds = %15, %0
%17 = load i32, i32* %5
%18 = sext i32 %17 to i64
%19 = and i64 %18, 67108864
%20 = icmp ne i64 %19, 0
br i1 %20, label %21, label %22
21: ; preds = %16
store i32 2, i32* %1
br label %22
22: ; preds = %21, %16
%23 = load i32, i32* %4
%24 = sext i32 %23 to i64
%25 = and i64 %24, 1
%26 = icmp ne i64 %25, 0
br i1 %26, label %27, label %28
27: ; preds = %22
store i32 3, i32* %1
br label %28
28: ; preds = %27, %22
%29 = load i32, i32* %1
ret i32 %29
}

LLVM IR (-O2):
define i32 @sse_level() {
%1 = tail call { i32, i32, i32, i32 } asm sideeffect " movl %ebx, %edi; cpuid;\09\09 movl %ebx, $1;\09 movl %edi, %ebx", "={ax},=r,={cx},={dx},{ax},~{edi},~{dirflag},~{fpsr},~{flags}"(i32 1)
%2 = extractvalue { i32, i32, i32, i32 } %1, 2
%3 = extractvalue { i32, i32, i32, i32 } %1, 3
%4 = zext i32 %3 to i64
%5 = and i64 %4, 33554432
%6 = icmp eq i64 %5, 0
%7 = select i1 %6, i32 -1, i32 1
%8 = and i64 %4, 67108864
%9 = icmp eq i64 %8, 0
%10 = select i1 %9, i32 %7, i32 2
%11 = and i32 %2, 1
%12 = icmp eq i32 %11, 0
%13 = select i1 %12, i32 %10, i32 3
ret i32 %13
}