char opteron_get_revision(int family, int model, int stepping) {
  if (family == 15) {
    if ((model == 4 || model == 5) && (stepping <= 1))
      return 'B';
    if (model < 16)
      return 'C';
    if (model < 32)
      return 'D';
    if (model < 64)
      return 'E';
    return 'F';
  }
  if (family == 31) {
    if (model < 2)
      return 'A';
    if (model < 4)
      return 'B';
    return 'C';
  }
  return 0;
}


x86 assembly (clang, -O0):
<opteron_get_revision>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
cmpl   $0xf,-0x8(%rbp)
jne    1180 <opteron_get_revision+0x80>
cmpl   $0x4,-0xc(%rbp)
je     112b <opteron_get_revision+0x2b>
cmpl   $0x5,-0xc(%rbp)
jne    113e <opteron_get_revision+0x3e>
cmpl   $0x1,-0x10(%rbp)
jg     113e <opteron_get_revision+0x3e>
movb   $0x42,-0x1(%rbp)
jmp    11bd <opteron_get_revision+0xbd>
cmpl   $0x10,-0xc(%rbp)
jge    1151 <opteron_get_revision+0x51>
movb   $0x43,-0x1(%rbp)
jmp    11bd <opteron_get_revision+0xbd>
cmpl   $0x20,-0xc(%rbp)
jge    1164 <opteron_get_revision+0x64>
movb   $0x44,-0x1(%rbp)
jmp    11bd <opteron_get_revision+0xbd>
cmpl   $0x40,-0xc(%rbp)
jge    1177 <opteron_get_revision+0x77>
movb   $0x45,-0x1(%rbp)
jmp    11bd <opteron_get_revision+0xbd>
movb   $0x46,-0x1(%rbp)
jmp    11bd <opteron_get_revision+0xbd>
cmpl   $0x1f,-0x8(%rbp)
jne    11b9 <opteron_get_revision+0xb9>
cmpl   $0x2,-0xc(%rbp)
jge    119d <opteron_get_revision+0x9d>
movb   $0x41,-0x1(%rbp)
jmp    11bd <opteron_get_revision+0xbd>
cmpl   $0x4,-0xc(%rbp)
jge    11b0 <opteron_get_revision+0xb0>
movb   $0x42,-0x1(%rbp)
jmp    11bd <opteron_get_revision+0xbd>
movb   $0x43,-0x1(%rbp)
jmp    11bd <opteron_get_revision+0xbd>
movb   $0x0,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<opteron_get_revision>:
cmp    $0x1f,%edi
je     1131 <opteron_get_revision+0x31>
cmp    $0xf,%edi
jne    1139 <opteron_get_revision+0x39>
mov    %esi,%eax
and    $0xfffffffe,%eax
cmp    $0x4,%eax
jne    111b <opteron_get_revision+0x1b>
mov    $0x42,%al
cmp    $0x2,%edx
jl     1138 <opteron_get_revision+0x38>
mov    $0x43,%al
cmp    $0x10,%esi
jl     1138 <opteron_get_revision+0x38>
mov    $0x44,%al
cmp    $0x20,%esi
jb     1138 <opteron_get_revision+0x38>
cmp    $0x40,%esi
mov    $0x46,%al
sbb    $0x0,%al
ret
mov    $0x41,%al
cmp    $0x2,%esi
jge    113c <opteron_get_revision+0x3c>
ret
xor    %eax,%eax
ret
cmp    $0x4,%esi
mov    $0x43,%al
sbb    $0x0,%al
ret

LLVM IR (-O0):
define signext i8 @opteron_get_revision(i32 %0, i32 %1, i32 %2) {
%4 = alloca i8
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store i32 %0, i32* %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%8 = load i32, i32* %5
%9 = icmp eq i32 %8, 15
br i1 %9, label %10, label %33
10: ; preds = %3
%11 = load i32, i32* %6
%12 = icmp eq i32 %11, 4
br i1 %12, label %16, label %13
13: ; preds = %10
%14 = load i32, i32* %6
%15 = icmp eq i32 %14, 5
br i1 %15, label %16, label %20
16: ; preds = %13, %10
%17 = load i32, i32* %7
%18 = icmp sle i32 %17, 1
br i1 %18, label %19, label %20
19: ; preds = %16
store i8 66, i8* %4
br label %46
20: ; preds = %16, %13
%21 = load i32, i32* %6
%22 = icmp slt i32 %21, 16
br i1 %22, label %23, label %24
23: ; preds = %20
store i8 67, i8* %4
br label %46
24: ; preds = %20
%25 = load i32, i32* %6
%26 = icmp slt i32 %25, 32
br i1 %26, label %27, label %28
27: ; preds = %24
store i8 68, i8* %4
br label %46
28: ; preds = %24
%29 = load i32, i32* %6
%30 = icmp slt i32 %29, 64
br i1 %30, label %31, label %32
31: ; preds = %28
store i8 69, i8* %4
br label %46
32: ; preds = %28
store i8 70, i8* %4
br label %46
33: ; preds = %3
%34 = load i32, i32* %5
%35 = icmp eq i32 %34, 31
br i1 %35, label %36, label %45
36: ; preds = %33
%37 = load i32, i32* %6
%38 = icmp slt i32 %37, 2
br i1 %38, label %39, label %40
39: ; preds = %36
store i8 65, i8* %4
br label %46
40: ; preds = %36
%41 = load i32, i32* %6
%42 = icmp slt i32 %41, 4
br i1 %42, label %43, label %44
43: ; preds = %40
store i8 66, i8* %4
br label %46
44: ; preds = %40
store i8 67, i8* %4
br label %46
45: ; preds = %33
store i8 0, i8* %4
br label %46
46: ; preds = %45, %44, %43, %39, %32, %31, %27, %23, %19
%47 = load i8, i8* %4
ret i8 %47
}

LLVM IR (-O2):
define signext i8 @opteron_get_revision(i32 %0, i32 %1, i32 %2) {
switch i32 %0, label %21 [
i32 15, label %4
i32 31, label %16
]
4: ; preds = %3
%5 = and i32 %1, -2
%6 = icmp eq i32 %5, 4
%7 = icmp slt i32 %2, 2
%8 = and i1 %6, %7
br i1 %8, label %21, label %9
9: ; preds = %4
%10 = icmp slt i32 %1, 16
br i1 %10, label %21, label %11
11: ; preds = %9
%12 = icmp ult i32 %1, 32
br i1 %12, label %21, label %13
13: ; preds = %11
%14 = icmp ult i32 %1, 64
%15 = select i1 %14, i8 69, i8 70
br label %21
16: ; preds = %3
%17 = icmp slt i32 %1, 2
br i1 %17, label %21, label %18
18: ; preds = %16
%19 = icmp ult i32 %1, 4
%20 = select i1 %19, i8 66, i8 67
br label %21
21: ; preds = %3, %18, %16, %13, %11, %9, %4
%22 = phi i8 [ 66, %4 ], [ 67, %9 ], [ 68, %11 ], [ %15, %13 ], [ 65, %16 ], [ %20, %18 ], [ 0, %3 ]
ret i8 %22
}