#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int GLsizei;
typedef int GLenum;

/* Variables and functions */
#define GL_MAP1_COLOR_4 145
#define GL_MAP1_INDEX 144
#define GL_MAP1_NORMAL 143
#define GL_MAP1_TEXTURE_COORD_1 142
#define GL_MAP1_TEXTURE_COORD_2 141
#define GL_MAP1_TEXTURE_COORD_3 140
#define GL_MAP1_TEXTURE_COORD_4 139
#define GL_MAP1_VERTEX_3 138
#define GL_MAP1_VERTEX_4 137
#define GL_MAP2_COLOR_4 136
#define GL_MAP2_INDEX 135
#define GL_MAP2_NORMAL 134
#define GL_MAP2_TEXTURE_COORD_1 133
#define GL_MAP2_TEXTURE_COORD_2 132
#define GL_MAP2_TEXTURE_COORD_3 131
#define GL_MAP2_TEXTURE_COORD_4 130
#define GL_MAP2_VERTEX_3 129
#define GL_MAP2_VERTEX_4 128
const GLsizei get_map_width(GLenum target) {
  switch (target) {
  case GL_MAP1_COLOR_4:
    return 4;
  case GL_MAP1_INDEX:
    return 3;
  case GL_MAP1_NORMAL:
    return 3;
  case GL_MAP1_TEXTURE_COORD_1:
    return 1;
  case GL_MAP1_TEXTURE_COORD_2:
    return 2;
  case GL_MAP1_TEXTURE_COORD_3:
    return 3;
  case GL_MAP1_TEXTURE_COORD_4:
    return 4;
  case GL_MAP1_VERTEX_3:
    return 3;
  case GL_MAP1_VERTEX_4:
    return 4;
  case GL_MAP2_COLOR_4:
    return 4;
  case GL_MAP2_INDEX:
    return 3;
  case GL_MAP2_NORMAL:
    return 3;
  case GL_MAP2_TEXTURE_COORD_1:
    return 1;
  case GL_MAP2_TEXTURE_COORD_2:
    return 2;
  case GL_MAP2_TEXTURE_COORD_3:
    return 3;
  case GL_MAP2_TEXTURE_COORD_4:
    return 4;
  case GL_MAP2_VERTEX_3:
    return 3;
  case GL_MAP2_VERTEX_4:
    return 4;
  }
  return 0;
}


x86 assembly (clang, -O0):
<get_map_width>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0xffffff80,%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0x11,%eax
ja     1208 <get_map_width+0x108>
mov    -0x10(%rbp),%rax
lea    0xed9(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x4,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x3,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x3,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x1,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x2,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x3,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x4,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x3,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x4,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x4,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x3,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x3,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x1,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x2,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x3,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x4,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x3,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x4,-0x4(%rbp)
jmp    120f <get_map_width+0x10f>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_map_width>:
add    $0xffffff80,%edi
xor    %eax,%eax
cmp    $0x11,%edi
ja     1117 <get_map_width+0x17>
movslq %edi,%rax
lea    0xeec(%rip),%rcx
mov    (%rcx,%rax,4),%eax
ret

LLVM IR (-O0):
define i32 @get_map_width(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
switch i32 %4, label %23 [
i32 145, label %5
i32 144, label %6
i32 143, label %7
i32 142, label %8
i32 141, label %9
i32 140, label %10
i32 139, label %11
i32 138, label %12
i32 137, label %13
i32 136, label %14
i32 135, label %15
i32 134, label %16
i32 133, label %17
i32 132, label %18
i32 131, label %19
i32 130, label %20
i32 129, label %21
i32 128, label %22
]
5: ; preds = %1
store i32 4, i32* %2
br label %24
6: ; preds = %1
store i32 3, i32* %2
br label %24
7: ; preds = %1
store i32 3, i32* %2
br label %24
8: ; preds = %1
store i32 1, i32* %2
br label %24
9: ; preds = %1
store i32 2, i32* %2
br label %24
10: ; preds = %1
store i32 3, i32* %2
br label %24
11: ; preds = %1
store i32 4, i32* %2
br label %24
12: ; preds = %1
store i32 3, i32* %2
br label %24
13: ; preds = %1
store i32 4, i32* %2
br label %24
14: ; preds = %1
store i32 4, i32* %2
br label %24
15: ; preds = %1
store i32 3, i32* %2
br label %24
16: ; preds = %1
store i32 3, i32* %2
br label %24
17: ; preds = %1
store i32 1, i32* %2
br label %24
18: ; preds = %1
store i32 2, i32* %2
br label %24
19: ; preds = %1
store i32 3, i32* %2
br label %24
20: ; preds = %1
store i32 4, i32* %2
br label %24
21: ; preds = %1
store i32 3, i32* %2
br label %24
22: ; preds = %1
store i32 4, i32* %2
br label %24
23: ; preds = %1
store i32 0, i32* %2
br label %24
24: ; preds = %23, %22, %21, %20, %19, %18, %17, %16, %15, %14, %13, %12, %11, %10, %9, %8, %7, %6, %5
%25 = load i32, i32* %2
ret i32 %25
}

LLVM IR (-O2):
@switch.table.get_map_width = [18 x i32] [i32 4, i32 3, i32 4, i32 3, i32 2, i32 1, i32 3, i32 3, i32 4, i32 4, i32 3, i32 4, i32 3, i32 2, i32 1, i32 3, i32 3, i32 4]
define i32 @get_map_width(i32 %0) {
%2 = add i32 %0, -128
%3 = icmp ult i32 %2, 18
br i1 %3, label %4, label %8
4: ; preds = %1
%5 = sext i32 %2 to i64
%6 = getelementptr inbounds [18 x i32], [18 x i32]* @switch.table.get_map_width, i64 0, i64 %5
%7 = load i32, i32* %6
br label %8
8: ; preds = %1, %4
%9 = phi i32 [ %7, %4 ], [ 0, %1 ]
ret i32 %9
}