void make_counts(unsigned size, unsigned const *displs, unsigned *cnts) {
  if (size) {
    unsigned ii;
    for (ii = 0; ii < size; ++ii)
      cnts[ii] = displs[ii + 1] - displs[ii];
  }
}


x86 assembly (clang, -O0):
<make_counts>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
cmpl   $0x0,-0x4(%rbp)
je     1162 <make_counts+0x62>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jae    115d <make_counts+0x5d>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,4),%edx
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    (%rax,%rcx,4),%edx
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %edx,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1120 <make_counts+0x20>
jmp    1162 <make_counts+0x62>
pop    %rbp
ret

x86 assembly (clang, -O2):
<make_counts>:
test   %edi,%edi
je     12a4 <make_counts+0x1a4>
mov    %edi,%r9d
cmp    $0x8,%edi
jb     112e <make_counts+0x2e>
lea    (%rsi,%r9,4),%rax
add    $0x4,%rax
cmp    %rdx,%rax
jbe    11cf <make_counts+0xcf>
lea    (%rdx,%r9,4),%rax
cmp    %rsi,%rax
jbe    11cf <make_counts+0xcf>
xor    %r10d,%r10d
mov    %r10,%r8
not    %r8
add    %r9,%r8
mov    %r9,%rax
and    $0x3,%rax
je     1176 <make_counts+0x76>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    0x1(%r10),%rdi
mov    0x4(%rsi,%r10,4),%ecx
sub    (%rsi,%r10,4),%ecx
mov    %ecx,(%rdx,%r10,4)
mov    %rdi,%r10
add    $0xffffffffffffffff,%rax
jne    1150 <make_counts+0x50>
cmp    $0x3,%r8
jb     12a4 <make_counts+0x1a4>
jmp    1190 <make_counts+0x90>
mov    %r10,%rdi
cmp    $0x3,%r8
jb     12a4 <make_counts+0x1a4>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    0x4(%rsi,%rdi,4),%eax
sub    (%rsi,%rdi,4),%eax
mov    %eax,(%rdx,%rdi,4)
mov    0x8(%rsi,%rdi,4),%eax
sub    0x4(%rsi,%rdi,4),%eax
mov    %eax,0x4(%rdx,%rdi,4)
mov    0xc(%rsi,%rdi,4),%eax
sub    0x8(%rsi,%rdi,4),%eax
mov    %eax,0x8(%rdx,%rdi,4)
mov    0x10(%rsi,%rdi,4),%eax
sub    0xc(%rsi,%rdi,4),%eax
mov    %eax,0xc(%rdx,%rdi,4)
lea    0x4(%rdi),%rax
mov    %rax,%rdi
cmp    %rax,%r9
jne    1190 <make_counts+0x90>
jmp    12a4 <make_counts+0x1a4>
mov    %r9d,%r10d
and    $0xfffffff8,%r10d
lea    -0x8(%r10),%rax
mov    %rax,%r8
shr    $0x3,%r8
add    $0x1,%r8
test   %rax,%rax
je     12a5 <make_counts+0x1a5>
mov    %r8,%rax
and    $0xfffffffffffffffe,%rax
xor    %edi,%edi
nopw   0x0(%rax,%rax,1)
movdqu (%rsi,%rdi,4),%xmm0
movdqu 0x4(%rsi,%rdi,4),%xmm1
psubd  %xmm0,%xmm1
movdqu 0x10(%rsi,%rdi,4),%xmm0
movdqu 0x14(%rsi,%rdi,4),%xmm2
psubd  %xmm0,%xmm2
movdqu %xmm1,(%rdx,%rdi,4)
movdqu %xmm2,0x10(%rdx,%rdi,4)
movdqu 0x20(%rsi,%rdi,4),%xmm0
movdqu 0x24(%rsi,%rdi,4),%xmm1
psubd  %xmm0,%xmm1
movdqu 0x30(%rsi,%rdi,4),%xmm0
movdqu 0x34(%rsi,%rdi,4),%xmm2
psubd  %xmm0,%xmm2
movdqu %xmm1,0x20(%rdx,%rdi,4)
movdqu %xmm2,0x30(%rdx,%rdi,4)
add    $0x10,%rdi
add    $0xfffffffffffffffe,%rax
jne    1200 <make_counts+0x100>
test   $0x1,%r8b
je     129b <make_counts+0x19b>
lea    0x0(,%rdi,4),%rax
or     $0x4,%rax
movdqu (%rsi,%rax,1),%xmm0
movdqu 0x10(%rsi,%rax,1),%xmm1
movdqu (%rsi,%rdi,4),%xmm2
psubd  %xmm2,%xmm0
movdqu 0x10(%rsi,%rdi,4),%xmm2
psubd  %xmm2,%xmm1
movdqu %xmm0,(%rdx,%rdi,4)
movdqu %xmm1,0x10(%rdx,%rdi,4)
cmp    %r9,%r10
jne    1131 <make_counts+0x31>
ret
xor    %edi,%edi
test   $0x1,%r8b
jne    1266 <make_counts+0x166>
jmp    129b <make_counts+0x19b>

LLVM IR (-O0):
define void @make_counts(i32 %0, i32* %1, i32* %2) {
%4 = alloca i32
%5 = alloca i32*
%6 = alloca i32*
%7 = alloca i32
store i32 %0, i32* %4
store i32* %1, i32** %5
store i32* %2, i32** %6
%8 = load i32, i32* %4
%9 = icmp ne i32 %8, 0
br i1 %9, label %10, label %36
10: ; preds = %3
store i32 0, i32* %7
br label %11
11: ; preds = %32, %10
%12 = load i32, i32* %7
%13 = load i32, i32* %4
%14 = icmp ult i32 %12, %13
br i1 %14, label %15, label %35
15: ; preds = %11
%16 = load i32*, i32** %5
%17 = load i32, i32* %7
%18 = add i32 %17, 1
%19 = zext i32 %18 to i64
%20 = getelementptr inbounds i32, i32* %16, i64 %19
%21 = load i32, i32* %20
%22 = load i32*, i32** %5
%23 = load i32, i32* %7
%24 = zext i32 %23 to i64
%25 = getelementptr inbounds i32, i32* %22, i64 %24
%26 = load i32, i32* %25
%27 = sub i32 %21, %26
%28 = load i32*, i32** %6
%29 = load i32, i32* %7
%30 = zext i32 %29 to i64
%31 = getelementptr inbounds i32, i32* %28, i64 %30
store i32 %27, i32* %31
br label %32
32: ; preds = %15
%33 = load i32, i32* %7
%34 = add i32 %33, 1
store i32 %34, i32* %7
br label %11
35: ; preds = %11
br label %36
36: ; preds = %35, %3
ret void
}

LLVM IR (-O2):
define void @make_counts(i32 %0, i32* nocapture %1, i32* nocapture writeonly %2) {
%4 = icmp eq i32 %0, 0
br i1 %4, label %146, label %5
5: ; preds = %3
%6 = zext i32 %0 to i64
%7 = icmp ult i32 %0, 8
br i1 %7, label %94, label %8
8: ; preds = %5
%9 = getelementptr i32, i32* %2, i64 %6
%10 = add nuw nsw i64 %6, 1
%11 = getelementptr i32, i32* %1, i64 %10
%12 = icmp ugt i32* %11, %2
%13 = icmp ugt i32* %9, %1
%14 = and i1 %12, %13
br i1 %14, label %94, label %15
15: ; preds = %8
%16 = and i64 %6, 4294967288
%17 = add nsw i64 %16, -8
%18 = lshr exact i64 %17, 3
%19 = add nuw nsw i64 %18, 1
%20 = and i64 %19, 1
%21 = icmp eq i64 %17, 0
br i1 %21, label %69, label %22
22: ; preds = %15
%23 = and i64 %19, 4611686018427387902
br label %24
24: ; preds = %24, %22
%25 = phi i64 [ 0, %22 ], [ %66, %24 ]
%26 = phi i64 [ 0, %22 ], [ %67, %24 ]
%27 = or i64 %25, 1
%28 = getelementptr inbounds i32, i32* %1, i64 %27
%29 = bitcast i32* %28 to <4 x i32>*
%30 = load <4 x i32>, <4 x i32>* %29
%31 = getelementptr inbounds i32, i32* %28, i64 4
%32 = bitcast i32* %31 to <4 x i32>*
%33 = load <4 x i32>, <4 x i32>* %32
%34 = getelementptr inbounds i32, i32* %1, i64 %25
%35 = bitcast i32* %34 to <4 x i32>*
%36 = load <4 x i32>, <4 x i32>* %35
%37 = getelementptr inbounds i32, i32* %34, i64 4
%38 = bitcast i32* %37 to <4 x i32>*
%39 = load <4 x i32>, <4 x i32>* %38
%40 = sub <4 x i32> %30, %36
%41 = sub <4 x i32> %33, %39
%42 = getelementptr inbounds i32, i32* %2, i64 %25
%43 = bitcast i32* %42 to <4 x i32>*
store <4 x i32> %40, <4 x i32>* %43
%44 = getelementptr inbounds i32, i32* %42, i64 4
%45 = bitcast i32* %44 to <4 x i32>*
store <4 x i32> %41, <4 x i32>* %45
%46 = or i64 %25, 8
%47 = or i64 %25, 9
%48 = getelementptr inbounds i32, i32* %1, i64 %47
%49 = bitcast i32* %48 to <4 x i32>*
%50 = load <4 x i32>, <4 x i32>* %49
%51 = getelementptr inbounds i32, i32* %48, i64 4
%52 = bitcast i32* %51 to <4 x i32>*
%53 = load <4 x i32>, <4 x i32>* %52
%54 = getelementptr inbounds i32, i32* %1, i64 %46
%55 = bitcast i32* %54 to <4 x i32>*
%56 = load <4 x i32>, <4 x i32>* %55
%57 = getelementptr inbounds i32, i32* %54, i64 4
%58 = bitcast i32* %57 to <4 x i32>*
%59 = load <4 x i32>, <4 x i32>* %58
%60 = sub <4 x i32> %50, %56
%61 = sub <4 x i32> %53, %59
%62 = getelementptr inbounds i32, i32* %2, i64 %46
%63 = bitcast i32* %62 to <4 x i32>*
store <4 x i32> %60, <4 x i32>* %63
%64 = getelementptr inbounds i32, i32* %62, i64 4
%65 = bitcast i32* %64 to <4 x i32>*
store <4 x i32> %61, <4 x i32>* %65
%66 = add nuw i64 %25, 16
%67 = add i64 %26, 2
%68 = icmp eq i64 %67, %23
br i1 %68, label %69, label %24
69: ; preds = %24, %15
%70 = phi i64 [ 0, %15 ], [ %66, %24 ]
%71 = icmp eq i64 %20, 0
br i1 %71, label %92, label %72
72: ; preds = %69
%73 = or i64 %70, 1
%74 = getelementptr inbounds i32, i32* %1, i64 %73
%75 = bitcast i32* %74 to <4 x i32>*
%76 = load <4 x i32>, <4 x i32>* %75
%77 = getelementptr inbounds i32, i32* %74, i64 4
%78 = bitcast i32* %77 to <4 x i32>*
%79 = load <4 x i32>, <4 x i32>* %78
%80 = getelementptr inbounds i32, i32* %1, i64 %70
%81 = bitcast i32* %80 to <4 x i32>*
%82 = load <4 x i32>, <4 x i32>* %81
%83 = getelementptr inbounds i32, i32* %80, i64 4
%84 = bitcast i32* %83 to <4 x i32>*
%85 = load <4 x i32>, <4 x i32>* %84
%86 = sub <4 x i32> %76, %82
%87 = sub <4 x i32> %79, %85
%88 = getelementptr inbounds i32, i32* %2, i64 %70
%89 = bitcast i32* %88 to <4 x i32>*
store <4 x i32> %86, <4 x i32>* %89
%90 = getelementptr inbounds i32, i32* %88, i64 4
%91 = bitcast i32* %90 to <4 x i32>*
store <4 x i32> %87, <4 x i32>* %91
br label %92
92: ; preds = %69, %72
%93 = icmp eq i64 %16, %6
br i1 %93, label %146, label %94
94: ; preds = %8, %5, %92
%95 = phi i64 [ 0, %8 ], [ 0, %5 ], [ %16, %92 ]
%96 = xor i64 %95, -1
%97 = add nsw i64 %96, %6
%98 = and i64 %6, 3
%99 = icmp eq i64 %98, 0
br i1 %99, label %112, label %100
100: ; preds = %94, %100
%101 = phi i64 [ %103, %100 ], [ %95, %94 ]
%102 = phi i64 [ %110, %100 ], [ 0, %94 ]
%103 = add nuw nsw i64 %101, 1
%104 = getelementptr inbounds i32, i32* %1, i64 %103
%105 = load i32, i32* %104
%106 = getelementptr inbounds i32, i32* %1, i64 %101
%107 = load i32, i32* %106
%108 = sub i32 %105, %107
%109 = getelementptr inbounds i32, i32* %2, i64 %101
store i32 %108, i32* %109
%110 = add i64 %102, 1
%111 = icmp eq i64 %110, %98
br i1 %111, label %112, label %100
112: ; preds = %100, %94
%113 = phi i64 [ %95, %94 ], [ %103, %100 ]
%114 = icmp ult i64 %97, 3
br i1 %114, label %146, label %115
115: ; preds = %112, %115
%116 = phi i64 [ %138, %115 ], [ %113, %112 ]
%117 = add nuw nsw i64 %116, 1
%118 = getelementptr inbounds i32, i32* %1, i64 %117
%119 = load i32, i32* %118
%120 = getelementptr inbounds i32, i32* %1, i64 %116
%121 = load i32, i32* %120
%122 = sub i32 %119, %121
%123 = getelementptr inbounds i32, i32* %2, i64 %116
store i32 %122, i32* %123
%124 = add nuw nsw i64 %116, 2
%125 = getelementptr inbounds i32, i32* %1, i64 %124
%126 = load i32, i32* %125
%127 = getelementptr inbounds i32, i32* %1, i64 %117
%128 = load i32, i32* %127
%129 = sub i32 %126, %128
%130 = getelementptr inbounds i32, i32* %2, i64 %117
store i32 %129, i32* %130
%131 = add nuw nsw i64 %116, 3
%132 = getelementptr inbounds i32, i32* %1, i64 %131
%133 = load i32, i32* %132
%134 = getelementptr inbounds i32, i32* %1, i64 %124
%135 = load i32, i32* %134
%136 = sub i32 %133, %135
%137 = getelementptr inbounds i32, i32* %2, i64 %124
store i32 %136, i32* %137
%138 = add nuw nsw i64 %116, 4
%139 = getelementptr inbounds i32, i32* %1, i64 %138
%140 = load i32, i32* %139
%141 = getelementptr inbounds i32, i32* %1, i64 %131
%142 = load i32, i32* %141
%143 = sub i32 %140, %142
%144 = getelementptr inbounds i32, i32* %2, i64 %131
store i32 %143, i32* %144
%145 = icmp eq i64 %138, %6
br i1 %145, label %146, label %115
146: ; preds = %112, %115, %92, %3
ret void
}