#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 */

/* Variables and functions */
int INT_MAX;
int hash(int tabsize, const char *s, int len) {
  register const char *p = s;
  register const char *end = p + len;
  register char c;
  register int hashval = 0;
  while (p != end) {
    c = *p++;
    if (c >= 0140)
      c -= 40;
    hashval = ((hashval << 3) + (hashval >> 28) + c);
  }
  hashval &= INT_MAX;
  return (hashval < tabsize) ? hashval : hashval % tabsize;
}


x86 assembly (clang, -O0):
<hash>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x28(%rbp),%rax
je     1181 <hash+0x81>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0x60,%eax
jl     1165 <hash+0x65>
movsbl -0x29(%rbp),%eax
sub    $0x28,%eax
mov    %al,-0x29(%rbp)
mov    -0x30(%rbp),%eax
shl    $0x3,%eax
mov    -0x30(%rbp),%ecx
sar    $0x1c,%ecx
add    %ecx,%eax
movsbl -0x29(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    112c <hash+0x2c>
mov    0x2e60(%rip),%rax
mov    (%rax),%eax
and    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11a7 <hash+0xa7>
mov    -0x30(%rbp),%edx
mov    %edx,-0x34(%rbp)
jmp    11b1 <hash+0xb1>
mov    -0x30(%rbp),%eax
cltd
idivl  -0x4(%rbp)
mov    %edx,-0x34(%rbp)
mov    -0x34(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<hash>:
test   %edx,%edx
je     1110 <hash+0x10>
movslq %edx,%r8
cmp    $0x1,%edx
jne    1114 <hash+0x14>
xor    %eax,%eax
jmp    1164 <hash+0x64>
xor    %eax,%eax
jmp    1186 <hash+0x86>
mov    %r8,%r10
and    $0xfffffffffffffffe,%r10
xor    %eax,%eax
nopl   (%rax)
movzbl (%rsi),%ecx
lea    -0x28(%rcx),%r9d
cmp    $0x60,%cl
movzbl %r9b,%edx
cmovl  %ecx,%edx
mov    %eax,%ecx
sar    $0x1c,%ecx
lea    (%rcx,%rax,8),%eax
movsbl %dl,%ecx
add    %eax,%ecx
movzbl 0x1(%rsi),%eax
add    $0x2,%rsi
lea    -0x28(%rax),%edx
cmp    $0x60,%al
movzbl %dl,%edx
cmovl  %eax,%edx
mov    %ecx,%eax
sar    $0x1c,%eax
lea    (%rax,%rcx,8),%ecx
movsbl %dl,%eax
add    %ecx,%eax
add    $0xfffffffffffffffe,%r10
jne    1120 <hash+0x20>
test   $0x1,%r8b
je     1186 <hash+0x86>
movzbl (%rsi),%ecx
lea    -0x28(%rcx),%edx
cmp    $0x60,%cl
movzbl %dl,%edx
cmovl  %ecx,%edx
mov    %eax,%ecx
sar    $0x1c,%ecx
lea    (%rcx,%rax,8),%ecx
movsbl %dl,%eax
add    %ecx,%eax
mov    0x2e5b(%rip),%rcx
and    (%rcx),%eax
cmp    %edi,%eax
jl     1198 <hash+0x98>
cltd
idiv   %edi
mov    %edx,%eax
ret

LLVM IR (-O0):
@INT_MAX = global i32 0
define i32 @hash(i32 %0, i8* %1, i32 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8
%10 = alloca i32
store i32 %0, i32* %4
store i8* %1, i8** %5
store i32 %2, i32* %6
%11 = load i8*, i8** %5
store i8* %11, i8** %7
%12 = load i8*, i8** %7
%13 = load i32, i32* %6
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds i8, i8* %12, i64 %14
store i8* %15, i8** %8
store i32 0, i32* %10
br label %16
16: ; preds = %32, %3
%17 = load i8*, i8** %7
%18 = load i8*, i8** %8
%19 = icmp ne i8* %17, %18
br i1 %19, label %20, label %41
20: ; preds = %16
%21 = load i8*, i8** %7
%22 = getelementptr inbounds i8, i8* %21, i32 1
store i8* %22, i8** %7
%23 = load i8, i8* %21
store i8 %23, i8* %9
%24 = load i8, i8* %9
%25 = sext i8 %24 to i32
%26 = icmp sge i32 %25, 96
br i1 %26, label %27, label %32
27: ; preds = %20
%28 = load i8, i8* %9
%29 = sext i8 %28 to i32
%30 = sub nsw i32 %29, 40
%31 = trunc i32 %30 to i8
store i8 %31, i8* %9
br label %32
32: ; preds = %27, %20
%33 = load i32, i32* %10
%34 = shl i32 %33, 3
%35 = load i32, i32* %10
%36 = ashr i32 %35, 28
%37 = add nsw i32 %34, %36
%38 = load i8, i8* %9
%39 = sext i8 %38 to i32
%40 = add nsw i32 %37, %39
store i32 %40, i32* %10
br label %16
41: ; preds = %16
%42 = load i32, i32* @INT_MAX
%43 = load i32, i32* %10
%44 = and i32 %43, %42
store i32 %44, i32* %10
%45 = load i32, i32* %10
%46 = load i32, i32* %4
%47 = icmp slt i32 %45, %46
br i1 %47, label %48, label %50
48: ; preds = %41
%49 = load i32, i32* %10
br label %54
50: ; preds = %41
%51 = load i32, i32* %10
%52 = load i32, i32* %4
%53 = srem i32 %51, %52
br label %54
54: ; preds = %50, %48
%55 = phi i32 [ %49, %48 ], [ %53, %50 ]
ret i32 %55
}

LLVM IR (-O2):
@INT_MAX = global i32 0
define i32 @hash(i32 %0, i8* %1, i32 %2) {
%4 = sext i32 %2 to i64
%5 = icmp eq i32 %2, 0
br i1 %5, label %52, label %6
6: ; preds = %3
%7 = and i64 %4, 1
%8 = icmp eq i32 %2, 1
br i1 %8, label %37, label %9
9: ; preds = %6
%10 = and i64 %4, -2
br label %11
11: ; preds = %11, %9
%12 = phi i32 [ 0, %9 ], [ %34, %11 ]
%13 = phi i8* [ %1, %9 ], [ %25, %11 ]
%14 = phi i64 [ 0, %9 ], [ %35, %11 ]
%15 = getelementptr inbounds i8, i8* %13, i64 1
%16 = load i8, i8* %13
%17 = icmp sgt i8 %16, 95
%18 = add i8 %16, -40
%19 = select i1 %17, i8 %18, i8 %16
%20 = shl i32 %12, 3
%21 = ashr i32 %12, 28
%22 = add nsw i32 %20, %21
%23 = sext i8 %19 to i32
%24 = add nsw i32 %22, %23
%25 = getelementptr inbounds i8, i8* %13, i64 2
%26 = load i8, i8* %15
%27 = icmp sgt i8 %26, 95
%28 = add i8 %26, -40
%29 = select i1 %27, i8 %28, i8 %26
%30 = shl i32 %24, 3
%31 = ashr i32 %24, 28
%32 = add nsw i32 %30, %31
%33 = sext i8 %29 to i32
%34 = add nsw i32 %32, %33
%35 = add i64 %14, 2
%36 = icmp eq i64 %35, %10
br i1 %36, label %37, label %11
37: ; preds = %11, %6
%38 = phi i32 [ undef, %6 ], [ %34, %11 ]
%39 = phi i32 [ 0, %6 ], [ %34, %11 ]
%40 = phi i8* [ %1, %6 ], [ %25, %11 ]
%41 = icmp eq i64 %7, 0
br i1 %41, label %52, label %42
42: ; preds = %37
%43 = load i8, i8* %40
%44 = icmp sgt i8 %43, 95
%45 = add i8 %43, -40
%46 = select i1 %44, i8 %45, i8 %43
%47 = shl i32 %39, 3
%48 = ashr i32 %39, 28
%49 = add nsw i32 %47, %48
%50 = sext i8 %46 to i32
%51 = add nsw i32 %49, %50
br label %52
52: ; preds = %42, %37, %3
%53 = phi i32 [ 0, %3 ], [ %38, %37 ], [ %51, %42 ]
%54 = load i32, i32* @INT_MAX
%55 = and i32 %54, %53
%56 = icmp slt i32 %55, %0
br i1 %56, label %59, label %57
57: ; preds = %52
%58 = srem i32 %55, %0
br label %59
59: ; preds = %52, %57
%60 = phi i32 [ %58, %57 ], [ %55, %52 ]
ret i32 %60
}