#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 uint8_t;

/* Variables and functions */
size_t despace_table(void *dst_void, void *src_void, size_t length) {
  uint8_t *src = (uint8_t *)src_void;
  uint8_t *dst = (uint8_t *)dst_void;
  static const uint8_t table[256] = {
      1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  for (; length != 0; length--) {
    size_t c = *src++;
    *dst = (uint8_t)c;
    dst += table[c];
  }
  return (size_t)(dst - ((uint8_t *)dst_void));
}


x86 assembly (clang, -O0):
<despace_table>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     117e <despace_table+0x7e>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movslq (%rax),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %eax,%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x30(%rbp),%rcx
lea    0xea8(%rip),%rax
mov    (%rax,%rcx,4),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    1120 <despace_table+0x20>
mov    -0x28(%rbp),%rax
mov    -0x8(%rbp),%rcx
sub    %rcx,%rax
sar    $0x2,%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<despace_table>:
test   %rdx,%rdx
je     1144 <despace_table+0x44>
lea    -0x1(%rdx),%r8
mov    %rdx,%r11
and    $0x3,%r11
je     1149 <despace_table+0x49>
lea    0xee7(%rip),%r9
mov    %rdi,%rax
nopl   0x0(%rax)
movslq (%rsi),%r10
add    $0x4,%rsi
mov    %r10d,(%rax)
movslq (%r9,%r10,4),%rcx
lea    (%rax,%rcx,4),%rax
add    $0xffffffffffffffff,%rdx
add    $0xffffffffffffffff,%r11
jne    1120 <despace_table+0x20>
cmp    $0x3,%r8
jae    1152 <despace_table+0x52>
jmp    11ab <despace_table+0xab>
mov    %rdi,%rax
jmp    11ab <despace_table+0xab>
mov    %rdi,%rax
cmp    $0x3,%r8
jb     11ab <despace_table+0xab>
xor    %ecx,%ecx
lea    0xea5(%rip),%r8
nopl   0x0(%rax,%rax,1)
movslq (%rsi,%rcx,4),%r9
mov    %r9d,(%rax)
movslq (%r8,%r9,4),%r9
lea    (%rax,%r9,4),%r10
movslq 0x4(%rsi,%rcx,4),%r11
mov    %r11d,(%rax,%r9,4)
movslq (%r8,%r11,4),%r11
lea    (%r10,%r11,4),%r9
movslq 0x8(%rsi,%rcx,4),%rax
mov    %eax,(%r10,%r11,4)
movslq (%r8,%rax,4),%r11
lea    (%r9,%r11,4),%r10
movslq 0xc(%rsi,%rcx,4),%rax
mov    %eax,(%r9,%r11,4)
movslq (%r8,%rax,4),%rax
lea    (%r10,%rax,4),%rax
add    $0x4,%rcx
cmp    %rcx,%rdx
jne    1160 <despace_table+0x60>
sub    %rdi,%rax
sar    $0x2,%rax
ret

LLVM IR (-O0):
@despace_table.table = internal constant [256 x i32] [i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 0, i32 0, i32 1, i32 1, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1]
define i64 @despace_table(i8* %0, i8* %1, i64 %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i64
%7 = alloca i32*
%8 = alloca i32*
%9 = alloca i64
store i8* %0, i8** %4
store i8* %1, i8** %5
store i64 %2, i64* %6
%10 = load i8*, i8** %5
%11 = bitcast i8* %10 to i32*
store i32* %11, i32** %7
%12 = load i8*, i8** %4
%13 = bitcast i8* %12 to i32*
store i32* %13, i32** %8
br label %14
14: ; preds = %31, %3
%15 = load i64, i64* %6
%16 = icmp ne i64 %15, 0
br i1 %16, label %17, label %34
17: ; preds = %14
%18 = load i32*, i32** %7
%19 = getelementptr inbounds i32, i32* %18, i32 1
store i32* %19, i32** %7
%20 = load i32, i32* %18
%21 = sext i32 %20 to i64
store i64 %21, i64* %9
%22 = load i64, i64* %9
%23 = trunc i64 %22 to i32
%24 = load i32*, i32** %8
store i32 %23, i32* %24
%25 = load i64, i64* %9
%26 = getelementptr inbounds [256 x i32], [256 x i32]* @despace_table.table, i64 0, i64 %25
%27 = load i32, i32* %26
%28 = load i32*, i32** %8
%29 = sext i32 %27 to i64
%30 = getelementptr inbounds i32, i32* %28, i64 %29
store i32* %30, i32** %8
br label %31
31: ; preds = %17
%32 = load i64, i64* %6
%33 = add i64 %32, -1
store i64 %33, i64* %6
br label %14
34: ; preds = %14
%35 = load i32*, i32** %8
%36 = load i8*, i8** %4
%37 = bitcast i8* %36 to i32*
%38 = ptrtoint i32* %35 to i64
%39 = ptrtoint i32* %37 to i64
%40 = sub i64 %38, %39
%41 = sdiv exact i64 %40, 4
ret i64 %41
}

LLVM IR (-O2):
@despace_table.table = internal unnamed_addr constant [256 x i32] [i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 0, i32 0, i32 1, i32 1, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1]
define i64 @despace_table(i8* %0, i8* nocapture %1, i64 %2) {
%4 = bitcast i8* %0 to i32*
%5 = icmp eq i64 %2, 0
br i1 %5, label %66, label %6
6: ; preds = %3
%7 = bitcast i8* %1 to i32*
%8 = add i64 %2, -1
%9 = and i64 %2, 3
%10 = icmp eq i64 %9, 0
br i1 %10, label %26, label %11
11: ; preds = %6, %11
%12 = phi i64 [ %23, %11 ], [ %2, %6 ]
%13 = phi i32* [ %22, %11 ], [ %4, %6 ]
%14 = phi i32* [ %16, %11 ], [ %7, %6 ]
%15 = phi i64 [ %24, %11 ], [ 0, %6 ]
%16 = getelementptr inbounds i32, i32* %14, i64 1
%17 = load i32, i32* %14
%18 = sext i32 %17 to i64
store i32 %17, i32* %13
%19 = getelementptr inbounds [256 x i32], [256 x i32]* @despace_table.table, i64 0, i64 %18
%20 = load i32, i32* %19
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds i32, i32* %13, i64 %21
%23 = add i64 %12, -1
%24 = add i64 %15, 1
%25 = icmp eq i64 %24, %9
br i1 %25, label %26, label %11
26: ; preds = %11, %6
%27 = phi i32* [ undef, %6 ], [ %22, %11 ]
%28 = phi i64 [ %2, %6 ], [ %23, %11 ]
%29 = phi i32* [ %4, %6 ], [ %22, %11 ]
%30 = phi i32* [ %7, %6 ], [ %16, %11 ]
%31 = icmp ult i64 %8, 3
br i1 %31, label %66, label %32
32: ; preds = %26, %32
%33 = phi i64 [ %64, %32 ], [ %28, %26 ]
%34 = phi i32* [ %63, %32 ], [ %29, %26 ]
%35 = phi i32* [ %57, %32 ], [ %30, %26 ]
%36 = getelementptr inbounds i32, i32* %35, i64 1
%37 = load i32, i32* %35
%38 = sext i32 %37 to i64
store i32 %37, i32* %34
%39 = getelementptr inbounds [256 x i32], [256 x i32]* @despace_table.table, i64 0, i64 %38
%40 = load i32, i32* %39
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i32, i32* %34, i64 %41
%43 = getelementptr inbounds i32, i32* %35, i64 2
%44 = load i32, i32* %36
%45 = sext i32 %44 to i64
store i32 %44, i32* %42
%46 = getelementptr inbounds [256 x i32], [256 x i32]* @despace_table.table, i64 0, i64 %45
%47 = load i32, i32* %46
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i32, i32* %42, i64 %48
%50 = getelementptr inbounds i32, i32* %35, i64 3
%51 = load i32, i32* %43
%52 = sext i32 %51 to i64
store i32 %51, i32* %49
%53 = getelementptr inbounds [256 x i32], [256 x i32]* @despace_table.table, i64 0, i64 %52
%54 = load i32, i32* %53
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i32, i32* %49, i64 %55
%57 = getelementptr inbounds i32, i32* %35, i64 4
%58 = load i32, i32* %50
%59 = sext i32 %58 to i64
store i32 %58, i32* %56
%60 = getelementptr inbounds [256 x i32], [256 x i32]* @despace_table.table, i64 0, i64 %59
%61 = load i32, i32* %60
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds i32, i32* %56, i64 %62
%64 = add i64 %33, -4
%65 = icmp eq i64 %64, 0
br i1 %65, label %66, label %32
66: ; preds = %26, %32, %3
%67 = phi i32* [ %4, %3 ], [ %27, %26 ], [ %63, %32 ]
%68 = ptrtoint i32* %67 to i64
%69 = ptrtoint i8* %0 to i64
%70 = sub i64 %68, %69
%71 = ashr exact i64 %70, 2
ret i64 %71
}