unsigned int _Rice_ReadWord(void *ptr, unsigned int idx, int format) {
  int sx;
  unsigned int x;
  switch (format) {
  case 1:
    sx = (int)((signed char *)ptr)[idx];
    x = sx < 0 ? -1 - (sx << 1) : sx << 1;
    break;
  case 2:
    x = (unsigned int)((unsigned char *)ptr)[idx];
    break;
  case 3:
    sx = (int)((signed short *)ptr)[idx];
    x = sx < 0 ? -1 - (sx << 1) : sx << 1;
    break;
  case 4:
    x = (unsigned int)((unsigned short *)ptr)[idx];
    break;
  case 7:
    sx = ((int *)ptr)[idx];
    x = sx < 0 ? -1 - (sx << 1) : sx << 1;
    break;
  case 8:
    x = ((unsigned int *)ptr)[idx];
    break;
  default:
    x = 0;
  }
  return x;
}


x86 assembly (clang, -O0):
<_Rice_ReadWord>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0x10(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x7,%eax
ja     1231 <_Rice_ReadWord+0x131>
mov    -0x20(%rbp),%rax
lea    0xed2(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jge    1164 <_Rice_ReadWord+0x64>
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
mov    $0xffffffff,%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
jmp    116d <_Rice_ReadWord+0x6d>
mov    -0x14(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    1238 <_Rice_ReadWord+0x138>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x18(%rbp)
jmp    1238 <_Rice_ReadWord+0x138>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jge    11b8 <_Rice_ReadWord+0xb8>
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
mov    $0xffffffff,%eax
sub    %ecx,%eax
mov    %eax,-0x28(%rbp)
jmp    11c1 <_Rice_ReadWord+0xc1>
mov    -0x14(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    1238 <_Rice_ReadWord+0x138>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
movzwl (%rax,%rcx,2),%eax
mov    %eax,-0x18(%rbp)
jmp    1238 <_Rice_ReadWord+0x138>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jge    120b <_Rice_ReadWord+0x10b>
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
mov    $0xffffffff,%eax
sub    %ecx,%eax
mov    %eax,-0x2c(%rbp)
jmp    1214 <_Rice_ReadWord+0x114>
mov    -0x14(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    1238 <_Rice_ReadWord+0x138>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x18(%rbp)
jmp    1238 <_Rice_ReadWord+0x138>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_Rice_ReadWord>:
xor    %eax,%eax
add    $0xffffffff,%edx
cmp    $0x7,%edx
ja     114f <_Rice_ReadWord+0x4f>
lea    0xeef(%rip),%rcx
movslq (%rcx,%rdx,4),%rdx
add    %rcx,%rdx
jmp    *%rdx
mov    %esi,%eax
movsbl (%rdi,%rax,1),%eax
jmp    113d <_Rice_ReadWord+0x3d>
mov    %esi,%eax
movzbl (%rdi,%rax,1),%eax
ret
mov    %esi,%eax
movswl (%rdi,%rax,2),%eax
jmp    113d <_Rice_ReadWord+0x3d>
mov    %esi,%eax
movzwl (%rdi,%rax,2),%eax
ret
mov    %esi,%eax
mov    (%rdi,%rax,4),%eax
lea    (%rax,%rax,1),%ecx
test   %eax,%eax
mov    %ecx,%eax
not    %eax
cmovns %ecx,%eax
ret
mov    %esi,%eax
mov    (%rdi,%rax,4),%eax
ret

LLVM IR (-O0):
define i32 @_Rice_ReadWord(i8* %0, i32 %1, i32 %2) {
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%9 = load i32, i32* %6
switch i32 %9, label %87 [
i32 1, label %10
i32 2, label %28
i32 3, label %35
i32 4, label %54
i32 7, label %62
i32 8, label %80
]
10: ; preds = %3
%11 = load i8*, i8** %4
%12 = load i32, i32* %5
%13 = zext i32 %12 to i64
%14 = getelementptr inbounds i8, i8* %11, i64 %13
%15 = load i8, i8* %14
%16 = sext i8 %15 to i32
store i32 %16, i32* %7
%17 = load i32, i32* %7
%18 = icmp slt i32 %17, 0
br i1 %18, label %19, label %23
19: ; preds = %10
%20 = load i32, i32* %7
%21 = shl i32 %20, 1
%22 = sub nsw i32 -1, %21
br label %26
23: ; preds = %10
%24 = load i32, i32* %7
%25 = shl i32 %24, 1
br label %26
26: ; preds = %23, %19
%27 = phi i32 [ %22, %19 ], [ %25, %23 ]
store i32 %27, i32* %8
br label %88
28: ; preds = %3
%29 = load i8*, i8** %4
%30 = load i32, i32* %5
%31 = zext i32 %30 to i64
%32 = getelementptr inbounds i8, i8* %29, i64 %31
%33 = load i8, i8* %32
%34 = zext i8 %33 to i32
store i32 %34, i32* %8
br label %88
35: ; preds = %3
%36 = load i8*, i8** %4
%37 = bitcast i8* %36 to i16*
%38 = load i32, i32* %5
%39 = zext i32 %38 to i64
%40 = getelementptr inbounds i16, i16* %37, i64 %39
%41 = load i16, i16* %40
%42 = sext i16 %41 to i32
store i32 %42, i32* %7
%43 = load i32, i32* %7
%44 = icmp slt i32 %43, 0
br i1 %44, label %45, label %49
45: ; preds = %35
%46 = load i32, i32* %7
%47 = shl i32 %46, 1
%48 = sub nsw i32 -1, %47
br label %52
49: ; preds = %35
%50 = load i32, i32* %7
%51 = shl i32 %50, 1
br label %52
52: ; preds = %49, %45
%53 = phi i32 [ %48, %45 ], [ %51, %49 ]
store i32 %53, i32* %8
br label %88
54: ; preds = %3
%55 = load i8*, i8** %4
%56 = bitcast i8* %55 to i16*
%57 = load i32, i32* %5
%58 = zext i32 %57 to i64
%59 = getelementptr inbounds i16, i16* %56, i64 %58
%60 = load i16, i16* %59
%61 = zext i16 %60 to i32
store i32 %61, i32* %8
br label %88
62: ; preds = %3
%63 = load i8*, i8** %4
%64 = bitcast i8* %63 to i32*
%65 = load i32, i32* %5
%66 = zext i32 %65 to i64
%67 = getelementptr inbounds i32, i32* %64, i64 %66
%68 = load i32, i32* %67
store i32 %68, i32* %7
%69 = load i32, i32* %7
%70 = icmp slt i32 %69, 0
br i1 %70, label %71, label %75
71: ; preds = %62
%72 = load i32, i32* %7
%73 = shl i32 %72, 1
%74 = sub nsw i32 -1, %73
br label %78
75: ; preds = %62
%76 = load i32, i32* %7
%77 = shl i32 %76, 1
br label %78
78: ; preds = %75, %71
%79 = phi i32 [ %74, %71 ], [ %77, %75 ]
store i32 %79, i32* %8
br label %88
80: ; preds = %3
%81 = load i8*, i8** %4
%82 = bitcast i8* %81 to i32*
%83 = load i32, i32* %5
%84 = zext i32 %83 to i64
%85 = getelementptr inbounds i32, i32* %82, i64 %84
%86 = load i32, i32* %85
store i32 %86, i32* %8
br label %88
87: ; preds = %3
store i32 0, i32* %8
br label %88
88: ; preds = %87, %80, %78, %54, %52, %28, %26
%89 = load i32, i32* %8
ret i32 %89
}

LLVM IR (-O2):
define i32 @_Rice_ReadWord(i8* nocapture %0, i32 %1, i32 %2) {
switch i32 %2, label %51 [
i32 1, label %4
i32 2, label %14
i32 3, label %19
i32 4, label %30
i32 7, label %36
i32 8, label %46
]
4: ; preds = %3
%5 = zext i32 %1 to i64
%6 = getelementptr inbounds i8, i8* %0, i64 %5
%7 = load i8, i8* %6
%8 = sext i8 %7 to i32
%9 = icmp slt i8 %7, 0
%10 = mul nsw i32 %8, -2
%11 = add nsw i32 %10, -1
%12 = shl nsw i32 %8, 1
%13 = select i1 %9, i32 %11, i32 %12
br label %51
14: ; preds = %3
%15 = zext i32 %1 to i64
%16 = getelementptr inbounds i8, i8* %0, i64 %15
%17 = load i8, i8* %16
%18 = zext i8 %17 to i32
br label %51
19: ; preds = %3
%20 = bitcast i8* %0 to i16*
%21 = zext i32 %1 to i64
%22 = getelementptr inbounds i16, i16* %20, i64 %21
%23 = load i16, i16* %22
%24 = sext i16 %23 to i32
%25 = icmp slt i16 %23, 0
%26 = mul nsw i32 %24, -2
%27 = add nsw i32 %26, -1
%28 = shl nsw i32 %24, 1
%29 = select i1 %25, i32 %27, i32 %28
br label %51
30: ; preds = %3
%31 = bitcast i8* %0 to i16*
%32 = zext i32 %1 to i64
%33 = getelementptr inbounds i16, i16* %31, i64 %32
%34 = load i16, i16* %33
%35 = zext i16 %34 to i32
br label %51
36: ; preds = %3
%37 = bitcast i8* %0 to i32*
%38 = zext i32 %1 to i64
%39 = getelementptr inbounds i32, i32* %37, i64 %38
%40 = load i32, i32* %39
%41 = icmp slt i32 %40, 0
%42 = mul i32 %40, -2
%43 = add i32 %42, -1
%44 = shl i32 %40, 1
%45 = select i1 %41, i32 %43, i32 %44
br label %51
46: ; preds = %3
%47 = bitcast i8* %0 to i32*
%48 = zext i32 %1 to i64
%49 = getelementptr inbounds i32, i32* %47, i64 %48
%50 = load i32, i32* %49
br label %51
51: ; preds = %3, %46, %36, %30, %19, %14, %4
%52 = phi i32 [ %50, %46 ], [ %45, %36 ], [ %35, %30 ], [ %29, %19 ], [ %18, %14 ], [ %13, %4 ], [ 0, %3 ]
ret i32 %52
}