char *pr_type(int t) {
  static char *ttab[] = {"Echo Reply",
                         "ICMP 1",
                         "ICMP 2",
                         "Dest Unreachable",
                         "Source Quench",
                         "Redirect",
                         "ICMP 6",
                         "ICMP 7",
                         "Echo",
                         "Router Advertise",
                         "Router Solicitation",
                         "Time Exceeded",
                         "Parameter Problem",
                         "Timestamp",
                         "Timestamp Reply",
                         "Info Request",
                         "Info Reply",
                         "Netmask Request",
                         "Netmask Reply"};
  if (t < 0 || t > 16)
    return ("OUT-OF-RANGE");
  return (ttab[t]);
}


x86 assembly (clang, -O0):
<pr_type>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
jl     111b <pr_type+0x1b>
cmpl   $0x10,-0xc(%rbp)
jle    112b <pr_type+0x2b>
lea    0xfc7(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    113e <pr_type+0x3e>
movslq -0xc(%rbp),%rcx
lea    0x2efa(%rip),%rax
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<pr_type>:
cmp    $0x10,%edi
jbe    110d <pr_type+0xd>
lea    0x1029(%rip),%rax
ret
mov    %edi,%eax
lea    0xeea(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
ret

LLVM IR (-O0):
@pr_type.ttab = internal global [19 x i8*] [i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.5, i32 0, i32 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.7, i32 0, i32 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i32 0, i32 0), i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.9, i32 0, i32 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.10, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.11, i32 0, i32 0), i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.12, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i32 0, i32 0), i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.14, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.15, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.16, i32 0, i32 0), i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.17, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.18, i32 0, i32 0)]
@.str = [11 x i8] c"Echo Reply\00"
@.str.1 = [7 x i8] c"ICMP 1\00"
@.str.2 = [7 x i8] c"ICMP 2\00"
@.str.3 = [17 x i8] c"Dest Unreachable\00"
@.str.4 = [14 x i8] c"Source Quench\00"
@.str.5 = [9 x i8] c"Redirect\00"
@.str.6 = [7 x i8] c"ICMP 6\00"
@.str.7 = [7 x i8] c"ICMP 7\00"
@.str.8 = [5 x i8] c"Echo\00"
@.str.9 = [17 x i8] c"Router Advertise\00"
@.str.10 = [20 x i8] c"Router Solicitation\00"
@.str.11 = [14 x i8] c"Time Exceeded\00"
@.str.12 = [18 x i8] c"Parameter Problem\00"
@.str.13 = [10 x i8] c"Timestamp\00"
@.str.14 = [16 x i8] c"Timestamp Reply\00"
@.str.15 = [13 x i8] c"Info Request\00"
@.str.16 = [11 x i8] c"Info Reply\00"
@.str.17 = [16 x i8] c"Netmask Request\00"
@.str.18 = [14 x i8] c"Netmask Reply\00"
@.str.19 = [13 x i8] c"OUT-OF-RANGE\00"
define i8* @pr_type(i32 %0) {
%2 = alloca i8*
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp slt i32 %4, 0
br i1 %5, label %9, label %6
6: ; preds = %1
%7 = load i32, i32* %3
%8 = icmp sgt i32 %7, 16
br i1 %8, label %9, label %10
9: ; preds = %6, %1
store i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i64 0, i64 0), i8** %2
br label %15
10: ; preds = %6
%11 = load i32, i32* %3
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds [19 x i8*], [19 x i8*]* @pr_type.ttab, i64 0, i64 %12
%14 = load i8*, i8** %13
store i8* %14, i8** %2
br label %15
15: ; preds = %10, %9
%16 = load i8*, i8** %2
ret i8* %16
}

LLVM IR (-O2):
@reltable.pr_type = internal unnamed_addr constant [19 x i32] [i32 trunc (i64 sub (i64 ptrtoint ([11 x i8]* @.str to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([7 x i8]* @.str.1 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([7 x i8]* @.str.2 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([17 x i8]* @.str.3 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([14 x i8]* @.str.4 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([9 x i8]* @.str.5 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([7 x i8]* @.str.6 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([7 x i8]* @.str.7 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([5 x i8]* @.str.8 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([17 x i8]* @.str.9 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([20 x i8]* @.str.10 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([14 x i8]* @.str.11 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([18 x i8]* @.str.12 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([10 x i8]* @.str.13 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([16 x i8]* @.str.14 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([13 x i8]* @.str.15 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([11 x i8]* @.str.16 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([16 x i8]* @.str.17 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([14 x i8]* @.str.18 to i64), i64 ptrtoint ([19 x i32]* @reltable.pr_type to i64)) to i32)]
@.str = [11 x i8] c"Echo Reply\00"
@.str.1 = [7 x i8] c"ICMP 1\00"
@.str.2 = [7 x i8] c"ICMP 2\00"
@.str.3 = [17 x i8] c"Dest Unreachable\00"
@.str.4 = [14 x i8] c"Source Quench\00"
@.str.5 = [9 x i8] c"Redirect\00"
@.str.6 = [7 x i8] c"ICMP 6\00"
@.str.7 = [7 x i8] c"ICMP 7\00"
@.str.8 = [5 x i8] c"Echo\00"
@.str.9 = [17 x i8] c"Router Advertise\00"
@.str.10 = [20 x i8] c"Router Solicitation\00"
@.str.11 = [14 x i8] c"Time Exceeded\00"
@.str.12 = [18 x i8] c"Parameter Problem\00"
@.str.13 = [10 x i8] c"Timestamp\00"
@.str.14 = [16 x i8] c"Timestamp Reply\00"
@.str.15 = [13 x i8] c"Info Request\00"
@.str.16 = [11 x i8] c"Info Reply\00"
@.str.17 = [16 x i8] c"Netmask Request\00"
@.str.18 = [14 x i8] c"Netmask Reply\00"
@.str.19 = [13 x i8] c"OUT-OF-RANGE\00"
define i8* @pr_type(i32 %0) {
%2 = icmp ugt i32 %0, 16
br i1 %2, label %7, label %3
3: ; preds = %1
%4 = zext i32 %0 to i64
%5 = shl i64 %4, 2
%6 = call i8* @llvm.load.relative.i64(i8* bitcast ([19 x i32]* @reltable.pr_type to i8*), i64 %5)
br label %7
7: ; preds = %1, %3
%8 = phi i8* [ %6, %3 ], [ getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i64 0, i64 0), %1 ]
ret i8* %8
}