extern int is_subset_of(const int *a, const int a_cnt, const int *b,
                        const int b_cnt) {
  if (a_cnt > b_cnt)
    return 0;
  int i;
  if (b_cnt < 10) {
    if (a_cnt > b_cnt)
      return 0;
    int j = 0;
    for (i = 0; i < a_cnt; i++)
      for (;; j++)
        if (j == b_cnt || b[j] > a[i])
          return 0;
        else if (a[i] == b[j])
          break;
    return 1;
  } else {
    int mid, high;
    int low = -1;
    for (i = 0; i < a_cnt; i++) {
      high = b_cnt - 1;
      low++;
      while (low < high) {
        mid = (low + high) / 2;
        if (b[mid] < a[i])
          low = mid + 1;
        else
          high = mid;
      }
      if (b[low] != a[i])
        return 0;
    }
    return 1;
  }
}


x86 assembly (clang, -O0):
<is_subset_of>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x24(%rbp),%eax
jle    112a <is_subset_of+0x2a>
movl   $0x0,-0x4(%rbp)
jmp    12b7 <is_subset_of+0x1b7>
cmpl   $0xa,-0x24(%rbp)
jge    11f7 <is_subset_of+0xf7>
mov    -0x14(%rbp),%eax
cmp    -0x24(%rbp),%eax
jle    114c <is_subset_of+0x4c>
movl   $0x0,-0x4(%rbp)
jmp    12b7 <is_subset_of+0x1b7>
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11eb <is_subset_of+0xeb>
jmp    116b <is_subset_of+0x6b>
mov    -0x2c(%rbp),%eax
cmp    -0x24(%rbp),%eax
je     1193 <is_subset_of+0x93>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
movslq -0x28(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jle    119f <is_subset_of+0x9f>
movl   $0x0,-0x4(%rbp)
jmp    12b7 <is_subset_of+0x1b7>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x20(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    11c0 <is_subset_of+0xc0>
jmp    11d8 <is_subset_of+0xd8>
jmp    11c5 <is_subset_of+0xc5>
jmp    11ca <is_subset_of+0xca>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    116b <is_subset_of+0x6b>
jmp    11dd <is_subset_of+0xdd>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    115a <is_subset_of+0x5a>
movl   $0x1,-0x4(%rbp)
jmp    12b7 <is_subset_of+0x1b7>
movl   $0xffffffff,-0x38(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12b0 <is_subset_of+0x1b0>
mov    -0x24(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    1275 <is_subset_of+0x175>
mov    -0x38(%rbp),%eax
add    -0x34(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
movslq -0x28(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jge    126a <is_subset_of+0x16a>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1270 <is_subset_of+0x170>
mov    -0x30(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    1223 <is_subset_of+0x123>
mov    -0x20(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
movslq -0x28(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
je     129d <is_subset_of+0x19d>
movl   $0x0,-0x4(%rbp)
jmp    12b7 <is_subset_of+0x1b7>
jmp    12a2 <is_subset_of+0x1a2>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1205 <is_subset_of+0x105>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<is_subset_of>:
push   %rbp
push   %rbx
xor    %eax,%eax
cmp    %ecx,%esi
jg     11de <is_subset_of+0xde>
mov    $0x1,%eax
cmp    $0xa,%ecx
jge    116a <is_subset_of+0x6a>
test   %esi,%esi
jle    11de <is_subset_of+0xde>
mov    %esi,%r8d
xor    %r9d,%r9d
xor    %r11d,%r11d
cmp    %ecx,%r11d
je     11dc <is_subset_of+0xdc>
mov    (%rdi,%r9,4),%r10d
movslq %r11d,%rsi
lea    (%rdx,%rsi,4),%rsi
nopl   0x0(%rax,%rax,1)
mov    (%rsi),%ebx
cmp    %r10d,%ebx
jg     11dc <is_subset_of+0xdc>
je     115f <is_subset_of+0x5f>
add    $0x1,%r11d
add    $0x4,%rsi
cmp    %r11d,%ecx
jne    1140 <is_subset_of+0x40>
jmp    11dc <is_subset_of+0xdc>
add    $0x1,%r9
cmp    %r8,%r9
jne    1127 <is_subset_of+0x27>
jmp    11de <is_subset_of+0xde>
test   %esi,%esi
jle    11de <is_subset_of+0xde>
add    $0xffffffff,%ecx
mov    %esi,%r8d
mov    $0xffffffff,%r11d
xor    %r9d,%r9d
nopl   (%rax)
add    $0x1,%r11d
mov    (%rdi,%r9,4),%r10d
cmp    %ecx,%r11d
jge    11c8 <is_subset_of+0xc8>
mov    %ecx,%esi
jmp    11a7 <is_subset_of+0xa7>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %ebx,%esi
cmp    %esi,%r11d
jge    11c8 <is_subset_of+0xc8>
lea    (%r11,%rsi,1),%ebp
mov    %ebp,%ebx
shr    $0x1f,%ebx
add    %ebp,%ebx
sar    %ebx
movslq %ebx,%rbp
cmp    %r10d,(%rdx,%rbp,4)
jge    11a0 <is_subset_of+0xa0>
add    $0x1,%ebx
mov    %ebx,%r11d
cmp    %esi,%r11d
jl     11a7 <is_subset_of+0xa7>
movslq %r11d,%rsi
cmp    %r10d,(%rdx,%rsi,4)
jne    11dc <is_subset_of+0xdc>
add    $0x1,%r9
cmp    %r8,%r9
jne    1180 <is_subset_of+0x80>
jmp    11de <is_subset_of+0xde>
xor    %eax,%eax
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define i32 @is_subset_of(i32* %0, i32 %1, i32* %2, i32 %3) {
%5 = alloca i32
%6 = alloca i32*
%7 = alloca i32
%8 = alloca i32*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
store i32* %0, i32** %6
store i32 %1, i32* %7
store i32* %2, i32** %8
store i32 %3, i32* %9
%15 = load i32, i32* %7
%16 = load i32, i32* %9
%17 = icmp sgt i32 %15, %16
br i1 %17, label %18, label %19
18: ; preds = %4
store i32 0, i32* %5
br label %127
19: ; preds = %4
%20 = load i32, i32* %9
%21 = icmp slt i32 %20, 10
br i1 %21, label %22, label %73
22: ; preds = %19
%23 = load i32, i32* %7
%24 = load i32, i32* %9
%25 = icmp sgt i32 %23, %24
br i1 %25, label %26, label %27
26: ; preds = %22
store i32 0, i32* %5
br label %127
27: ; preds = %22
store i32 0, i32* %11
store i32 0, i32* %10
br label %28
28: ; preds = %69, %27
%29 = load i32, i32* %10
%30 = load i32, i32* %7
%31 = icmp slt i32 %29, %30
br i1 %31, label %32, label %72
32: ; preds = %28
br label %33
33: ; preds = %65, %32
%34 = load i32, i32* %11
%35 = load i32, i32* %9
%36 = icmp eq i32 %34, %35
br i1 %36, label %49, label %37
37: ; preds = %33
%38 = load i32*, i32** %8
%39 = load i32, i32* %11
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds i32, i32* %38, i64 %40
%42 = load i32, i32* %41
%43 = load i32*, i32** %6
%44 = load i32, i32* %10
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i32, i32* %43, i64 %45
%47 = load i32, i32* %46
%48 = icmp sgt i32 %42, %47
br i1 %48, label %49, label %50
49: ; preds = %37, %33
store i32 0, i32* %5
br label %127
50: ; preds = %37
%51 = load i32*, i32** %6
%52 = load i32, i32* %10
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds i32, i32* %51, i64 %53
%55 = load i32, i32* %54
%56 = load i32*, i32** %8
%57 = load i32, i32* %11
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i32, i32* %56, i64 %58
%60 = load i32, i32* %59
%61 = icmp eq i32 %55, %60
br i1 %61, label %62, label %63
62: ; preds = %50
br label %68
63: ; preds = %50
br label %64
64: ; preds = %63
br label %65
65: ; preds = %64
%66 = load i32, i32* %11
%67 = add nsw i32 %66, 1
store i32 %67, i32* %11
br label %33
68: ; preds = %62
br label %69
69: ; preds = %68
%70 = load i32, i32* %10
%71 = add nsw i32 %70, 1
store i32 %71, i32* %10
br label %28
72: ; preds = %28
store i32 1, i32* %5
br label %127
73: ; preds = %19
store i32 -1, i32* %14
store i32 0, i32* %10
br label %74
74: ; preds = %123, %73
%75 = load i32, i32* %10
%76 = load i32, i32* %7
%77 = icmp slt i32 %75, %76
br i1 %77, label %78, label %126
78: ; preds = %74
%79 = load i32, i32* %9
%80 = sub nsw i32 %79, 1
store i32 %80, i32* %13
%81 = load i32, i32* %14
%82 = add nsw i32 %81, 1
store i32 %82, i32* %14
br label %83
83: ; preds = %108, %78
%84 = load i32, i32* %14
%85 = load i32, i32* %13
%86 = icmp slt i32 %84, %85
br i1 %86, label %87, label %109
87: ; preds = %83
%88 = load i32, i32* %14
%89 = load i32, i32* %13
%90 = add nsw i32 %88, %89
%91 = sdiv i32 %90, 2
store i32 %91, i32* %12
%92 = load i32*, i32** %8
%93 = load i32, i32* %12
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds i32, i32* %92, i64 %94
%96 = load i32, i32* %95
%97 = load i32*, i32** %6
%98 = load i32, i32* %10
%99 = sext i32 %98 to i64
%100 = getelementptr inbounds i32, i32* %97, i64 %99
%101 = load i32, i32* %100
%102 = icmp slt i32 %96, %101
br i1 %102, label %103, label %106
103: ; preds = %87
%104 = load i32, i32* %12
%105 = add nsw i32 %104, 1
store i32 %105, i32* %14
br label %108
106: ; preds = %87
%107 = load i32, i32* %12
store i32 %107, i32* %13
br label %108
108: ; preds = %106, %103
br label %83
109: ; preds = %83
%110 = load i32*, i32** %8
%111 = load i32, i32* %14
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds i32, i32* %110, i64 %112
%114 = load i32, i32* %113
%115 = load i32*, i32** %6
%116 = load i32, i32* %10
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds i32, i32* %115, i64 %117
%119 = load i32, i32* %118
%120 = icmp ne i32 %114, %119
br i1 %120, label %121, label %122
121: ; preds = %109
store i32 0, i32* %5
br label %127
122: ; preds = %109
br label %123
123: ; preds = %122
%124 = load i32, i32* %10
%125 = add nsw i32 %124, 1
store i32 %125, i32* %10
br label %74
126: ; preds = %74
store i32 1, i32* %5
br label %127
127: ; preds = %126, %121, %72, %49, %26, %18
%128 = load i32, i32* %5
ret i32 %128
}

LLVM IR (-O2):
define i32 @is_subset_of(i32* nocapture %0, i32 %1, i32* nocapture %2, i32 %3) {
%5 = icmp sgt i32 %1, %3
br i1 %5, label %68, label %6
6: ; preds = %4
%7 = icmp slt i32 %3, 10
%8 = icmp sgt i32 %1, 0
br i1 %7, label %13, label %9
9: ; preds = %6
br i1 %8, label %10, label %68
10: ; preds = %9
%11 = add nsw i32 %3, -1
%12 = zext i32 %1 to i64
br label %41
13: ; preds = %6
br i1 %8, label %14, label %68
14: ; preds = %13
%15 = zext i32 %1 to i64
br label %16
16: ; preds = %14, %35
%17 = phi i64 [ 0, %14 ], [ %37, %35 ]
%18 = phi i32 [ 0, %14 ], [ %36, %35 ]
%19 = icmp eq i32 %18, %3
br i1 %19, label %68, label %20
20: ; preds = %16
%21 = getelementptr inbounds i32, i32* %0, i64 %17
%22 = load i32, i32* %21
%23 = sext i32 %18 to i64
br label %24
24: ; preds = %20, %31
%25 = phi i64 [ %23, %20 ], [ %32, %31 ]
%26 = getelementptr inbounds i32, i32* %2, i64 %25
%27 = load i32, i32* %26
%28 = icmp sgt i32 %27, %22
br i1 %28, label %68, label %29
29: ; preds = %24
%30 = icmp eq i32 %22, %27
br i1 %30, label %35, label %31
31: ; preds = %29
%32 = add nsw i64 %25, 1
%33 = trunc i64 %32 to i32
%34 = icmp eq i32 %33, %3
br i1 %34, label %68, label %24
35: ; preds = %29
%36 = trunc i64 %25 to i32
%37 = add nuw nsw i64 %17, 1
%38 = icmp eq i64 %37, %15
br i1 %38, label %68, label %16
39: ; preds = %61
%40 = icmp eq i64 %67, %12
br i1 %40, label %68, label %41
41: ; preds = %10, %39
%42 = phi i64 [ 0, %10 ], [ %67, %39 ]
%43 = phi i32 [ -1, %10 ], [ %62, %39 ]
%44 = add nsw i32 %43, 1
%45 = icmp slt i32 %44, %11
%46 = getelementptr inbounds i32, i32* %0, i64 %42
%47 = load i32, i32* %46
br i1 %45, label %48, label %61
48: ; preds = %41, %48
%49 = phi i32 [ %59, %48 ], [ %44, %41 ]
%50 = phi i32 [ %58, %48 ], [ %11, %41 ]
%51 = add nsw i32 %49, %50
%52 = sdiv i32 %51, 2
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds i32, i32* %2, i64 %53
%55 = load i32, i32* %54
%56 = icmp slt i32 %55, %47
%57 = add nsw i32 %52, 1
%58 = select i1 %56, i32 %50, i32 %52
%59 = select i1 %56, i32 %57, i32 %49
%60 = icmp slt i32 %59, %58
br i1 %60, label %48, label %61
61: ; preds = %48, %41
%62 = phi i32 [ %44, %41 ], [ %59, %48 ]
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds i32, i32* %2, i64 %63
%65 = load i32, i32* %64
%66 = icmp eq i32 %65, %47
%67 = add nuw nsw i64 %42, 1
br i1 %66, label %39, label %68
68: ; preds = %61, %39, %35, %16, %24, %31, %9, %13, %4
%69 = phi i32 [ 0, %4 ], [ 1, %13 ], [ 1, %9 ], [ 0, %31 ], [ 0, %24 ], [ 0, %16 ], [ 1, %35 ], [ 0, %61 ], [ 1, %39 ]
ret i32 %69
}