int licomb_y(unsigned char *a, unsigned char *b, int s) {
  int i, j, diff = 0;
  for (i = 4; i; i--) {
    for (j = 0; j < 8; j++)
      diff += ((((a[j] << 1) - b[j - s] - b[j]) ^
                (((a[j] << 1) - b[j - s] - b[j]) >> 31)) -
               (((a[j] << 1) - b[j - s] - b[j]) >> 31)) +
              ((((b[j] << 1) - a[j] - a[j + s]) ^
                (((b[j] << 1) - a[j] - a[j + s]) >> 31)) -
               (((b[j] << 1) - a[j] - a[j + s]) >> 31));
    a += s;
    b += s;
  }
  return diff;
}


x86 assembly (clang, -O0):
<licomb_y>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x4,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
je     12b2 <licomb_y+0x1b2>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x8,-0x1c(%rbp)
jge    1282 <licomb_y+0x182>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
shl    $0x1,%eax
mov    -0x10(%rbp),%rcx
mov    -0x1c(%rbp),%edx
sub    -0x14(%rbp),%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
mov    -0x8(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
shl    $0x1,%ecx
mov    -0x10(%rbp),%rdx
mov    -0x1c(%rbp),%esi
sub    -0x14(%rbp),%esi
movslq %esi,%rsi
movzbl (%rdx,%rsi,1),%edx
sub    %edx,%ecx
mov    -0x10(%rbp),%rdx
movslq -0x1c(%rbp),%rsi
movzbl (%rdx,%rsi,1),%edx
sub    %edx,%ecx
sar    $0x1f,%ecx
xor    %ecx,%eax
mov    -0x8(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
shl    $0x1,%ecx
mov    -0x10(%rbp),%rdx
mov    -0x1c(%rbp),%esi
sub    -0x14(%rbp),%esi
movslq %esi,%rsi
movzbl (%rdx,%rsi,1),%edx
sub    %edx,%ecx
mov    -0x10(%rbp),%rdx
movslq -0x1c(%rbp),%rsi
movzbl (%rdx,%rsi,1),%edx
sub    %edx,%ecx
sar    $0x1f,%ecx
sub    %ecx,%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
shl    $0x1,%ecx
mov    -0x8(%rbp),%rdx
movslq -0x1c(%rbp),%rsi
movzbl (%rdx,%rsi,1),%edx
sub    %edx,%ecx
mov    -0x8(%rbp),%rdx
mov    -0x1c(%rbp),%esi
add    -0x14(%rbp),%esi
movslq %esi,%rsi
movzbl (%rdx,%rsi,1),%edx
sub    %edx,%ecx
mov    -0x10(%rbp),%rdx
movslq -0x1c(%rbp),%rsi
movzbl (%rdx,%rsi,1),%edx
shl    $0x1,%edx
mov    -0x8(%rbp),%rsi
movslq -0x1c(%rbp),%rdi
movzbl (%rsi,%rdi,1),%esi
sub    %esi,%edx
mov    -0x8(%rbp),%rsi
mov    -0x1c(%rbp),%edi
add    -0x14(%rbp),%edi
movslq %edi,%rdi
movzbl (%rsi,%rdi,1),%esi
sub    %esi,%edx
sar    $0x1f,%edx
xor    %edx,%ecx
mov    -0x10(%rbp),%rdx
movslq -0x1c(%rbp),%rsi
movzbl (%rdx,%rsi,1),%edx
shl    $0x1,%edx
mov    -0x8(%rbp),%rsi
movslq -0x1c(%rbp),%rdi
movzbl (%rsi,%rdi,1),%esi
sub    %esi,%edx
mov    -0x8(%rbp),%rsi
mov    -0x1c(%rbp),%edi
add    -0x14(%rbp),%edi
movslq %edi,%rdi
movzbl (%rsi,%rdi,1),%esi
sub    %esi,%edx
sar    $0x1f,%edx
sub    %edx,%ecx
add    %ecx,%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    112e <licomb_y+0x2e>
mov    -0x14(%rbp),%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    111d <licomb_y+0x1d>
mov    -0x20(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<licomb_y>:
movslq %edx,%r9
mov    %r9,%r8
neg    %r8
xor    %eax,%eax
mov    $0xfffffffc,%edx
pxor   %xmm8,%xmm8
cs nopw 0x0(%rax,%rax,1)
nop
movq   (%rdi),%xmm2
movq   (%rdi,%r9,1),%xmm13
add    %r9,%rdi
movq   (%rsi,%r8,1),%xmm9
movq   (%rsi),%xmm3
punpcklbw %xmm8,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm6
packuswb %xmm6,%xmm6
punpcklbw %xmm8,%xmm3
movdqa %xmm3,%xmm5
punpckhwd %xmm8,%xmm5
punpcklbw %xmm8,%xmm6
movdqa %xmm6,%xmm7
punpckhwd %xmm8,%xmm7
punpcklwd %xmm8,%xmm3
punpcklwd %xmm8,%xmm6
pshufd $0x1b,%xmm6,%xmm10
paddd  %xmm6,%xmm6
pshufd $0x1b,%xmm3,%xmm11
movdqa %xmm3,%xmm2
paddd  %xmm3,%xmm2
pshufd $0x1b,%xmm7,%xmm12
movdqa %xmm7,%xmm3
paddd  %xmm7,%xmm3
pshufd $0x1b,%xmm5,%xmm7
paddd  %xmm5,%xmm5
punpcklbw %xmm8,%xmm9
pshufd $0x4e,%xmm9,%xmm4
pshuflw $0x1b,%xmm4,%xmm4
pshufhw $0x1b,%xmm4,%xmm4
packuswb %xmm4,%xmm4
punpcklbw %xmm8,%xmm13
movdqa %xmm13,%xmm1
punpckhwd %xmm8,%xmm1
punpcklbw %xmm8,%xmm4
movdqa %xmm4,%xmm0
punpckhwd %xmm8,%xmm0
punpcklwd %xmm8,%xmm13
punpcklwd %xmm8,%xmm4
paddd  %xmm1,%xmm10
psubd  %xmm10,%xmm5
paddd  %xmm0,%xmm11
psubd  %xmm11,%xmm3
paddd  %xmm13,%xmm12
psubd  %xmm12,%xmm2
paddd  %xmm4,%xmm7
psubd  %xmm7,%xmm6
movdqa %xmm6,%xmm0
psrad  $0x1f,%xmm0
paddd  %xmm0,%xmm6
pxor   %xmm0,%xmm6
movdqa %xmm2,%xmm0
psrad  $0x1f,%xmm0
paddd  %xmm0,%xmm2
pxor   %xmm0,%xmm2
paddd  %xmm6,%xmm2
movdqa %xmm3,%xmm0
psrad  $0x1f,%xmm0
paddd  %xmm0,%xmm3
pxor   %xmm0,%xmm3
movdqa %xmm5,%xmm0
psrad  $0x1f,%xmm0
paddd  %xmm0,%xmm5
pxor   %xmm0,%xmm5
paddd  %xmm3,%xmm5
paddd  %xmm2,%xmm5
pshufd $0xee,%xmm5,%xmm0
paddd  %xmm5,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%ecx
add    %ecx,%eax
add    %r9,%rsi
inc    %edx
jne    1120 <licomb_y+0x20>
ret

LLVM IR (-O0):
define i32 @licomb_y(i8* %0, i8* %1, i32 %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i8* %0, i8** %4
store i8* %1, i8** %5
store i32 %2, i32* %6
store i32 0, i32* %9
store i32 4, i32* %7
br label %10
10: ; preds = %179, %3
%11 = load i32, i32* %7
%12 = icmp ne i32 %11, 0
br i1 %12, label %13, label %182
13: ; preds = %10
store i32 0, i32* %8
br label %14
14: ; preds = %167, %13
%15 = load i32, i32* %8
%16 = icmp slt i32 %15, 8
br i1 %16, label %17, label %170
17: ; preds = %14
%18 = load i8*, i8** %4
%19 = load i32, i32* %8
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i8, i8* %18, i64 %20
%22 = load i8, i8* %21
%23 = zext i8 %22 to i32
%24 = shl i32 %23, 1
%25 = load i8*, i8** %5
%26 = load i32, i32* %8
%27 = load i32, i32* %6
%28 = sub nsw i32 %26, %27
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i8, i8* %25, i64 %29
%31 = load i8, i8* %30
%32 = zext i8 %31 to i32
%33 = sub nsw i32 %24, %32
%34 = load i8*, i8** %5
%35 = load i32, i32* %8
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %34, i64 %36
%38 = load i8, i8* %37
%39 = zext i8 %38 to i32
%40 = sub nsw i32 %33, %39
%41 = load i8*, i8** %4
%42 = load i32, i32* %8
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds i8, i8* %41, i64 %43
%45 = load i8, i8* %44
%46 = zext i8 %45 to i32
%47 = shl i32 %46, 1
%48 = load i8*, i8** %5
%49 = load i32, i32* %8
%50 = load i32, i32* %6
%51 = sub nsw i32 %49, %50
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i8, i8* %48, i64 %52
%54 = load i8, i8* %53
%55 = zext i8 %54 to i32
%56 = sub nsw i32 %47, %55
%57 = load i8*, i8** %5
%58 = load i32, i32* %8
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8, i8* %57, i64 %59
%61 = load i8, i8* %60
%62 = zext i8 %61 to i32
%63 = sub nsw i32 %56, %62
%64 = ashr i32 %63, 31
%65 = xor i32 %40, %64
%66 = load i8*, i8** %4
%67 = load i32, i32* %8
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds i8, i8* %66, i64 %68
%70 = load i8, i8* %69
%71 = zext i8 %70 to i32
%72 = shl i32 %71, 1
%73 = load i8*, i8** %5
%74 = load i32, i32* %8
%75 = load i32, i32* %6
%76 = sub nsw i32 %74, %75
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds i8, i8* %73, i64 %77
%79 = load i8, i8* %78
%80 = zext i8 %79 to i32
%81 = sub nsw i32 %72, %80
%82 = load i8*, i8** %5
%83 = load i32, i32* %8
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds i8, i8* %82, i64 %84
%86 = load i8, i8* %85
%87 = zext i8 %86 to i32
%88 = sub nsw i32 %81, %87
%89 = ashr i32 %88, 31
%90 = sub nsw i32 %65, %89
%91 = load i8*, i8** %5
%92 = load i32, i32* %8
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i8, i8* %91, i64 %93
%95 = load i8, i8* %94
%96 = zext i8 %95 to i32
%97 = shl i32 %96, 1
%98 = load i8*, i8** %4
%99 = load i32, i32* %8
%100 = sext i32 %99 to i64
%101 = getelementptr inbounds i8, i8* %98, i64 %100
%102 = load i8, i8* %101
%103 = zext i8 %102 to i32
%104 = sub nsw i32 %97, %103
%105 = load i8*, i8** %4
%106 = load i32, i32* %8
%107 = load i32, i32* %6
%108 = add nsw i32 %106, %107
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds i8, i8* %105, i64 %109
%111 = load i8, i8* %110
%112 = zext i8 %111 to i32
%113 = sub nsw i32 %104, %112
%114 = load i8*, i8** %5
%115 = load i32, i32* %8
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds i8, i8* %114, i64 %116
%118 = load i8, i8* %117
%119 = zext i8 %118 to i32
%120 = shl i32 %119, 1
%121 = load i8*, i8** %4
%122 = load i32, i32* %8
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds i8, i8* %121, i64 %123
%125 = load i8, i8* %124
%126 = zext i8 %125 to i32
%127 = sub nsw i32 %120, %126
%128 = load i8*, i8** %4
%129 = load i32, i32* %8
%130 = load i32, i32* %6
%131 = add nsw i32 %129, %130
%132 = sext i32 %131 to i64
%133 = getelementptr inbounds i8, i8* %128, i64 %132
%134 = load i8, i8* %133
%135 = zext i8 %134 to i32
%136 = sub nsw i32 %127, %135
%137 = ashr i32 %136, 31
%138 = xor i32 %113, %137
%139 = load i8*, i8** %5
%140 = load i32, i32* %8
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds i8, i8* %139, i64 %141
%143 = load i8, i8* %142
%144 = zext i8 %143 to i32
%145 = shl i32 %144, 1
%146 = load i8*, i8** %4
%147 = load i32, i32* %8
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds i8, i8* %146, i64 %148
%150 = load i8, i8* %149
%151 = zext i8 %150 to i32
%152 = sub nsw i32 %145, %151
%153 = load i8*, i8** %4
%154 = load i32, i32* %8
%155 = load i32, i32* %6
%156 = add nsw i32 %154, %155
%157 = sext i32 %156 to i64
%158 = getelementptr inbounds i8, i8* %153, i64 %157
%159 = load i8, i8* %158
%160 = zext i8 %159 to i32
%161 = sub nsw i32 %152, %160
%162 = ashr i32 %161, 31
%163 = sub nsw i32 %138, %162
%164 = add nsw i32 %90, %163
%165 = load i32, i32* %9
%166 = add nsw i32 %165, %164
store i32 %166, i32* %9
br label %167
167: ; preds = %17
%168 = load i32, i32* %8
%169 = add nsw i32 %168, 1
store i32 %169, i32* %8
br label %14
170: ; preds = %14
%171 = load i32, i32* %6
%172 = load i8*, i8** %4
%173 = sext i32 %171 to i64
%174 = getelementptr inbounds i8, i8* %172, i64 %173
store i8* %174, i8** %4
%175 = load i32, i32* %6
%176 = load i8*, i8** %5
%177 = sext i32 %175 to i64
%178 = getelementptr inbounds i8, i8* %176, i64 %177
store i8* %178, i8** %5
br label %179
179: ; preds = %170
%180 = load i32, i32* %7
%181 = add nsw i32 %180, -1
store i32 %181, i32* %7
br label %10
182: ; preds = %10
%183 = load i32, i32* %9
ret i32 %183
}

LLVM IR (-O2):
define i32 @licomb_y(i8* nocapture %0, i8* nocapture %1, i32 %2) {
%4 = sext i32 %2 to i64
%5 = sub nsw i64 0, %4
br label %6
6: ; preds = %3, %6
%7 = phi i32 [ 0, %3 ], [ %35, %6 ]
%8 = phi i32 [ 4, %3 ], [ %37, %6 ]
%9 = phi i8* [ %0, %3 ], [ %12, %6 ]
%10 = phi i8* [ %1, %3 ], [ %36, %6 ]
%11 = getelementptr inbounds i8, i8* %10, i64 %5
%12 = getelementptr inbounds i8, i8* %9, i64 %4
%13 = bitcast i8* %9 to <8 x i8>*
%14 = load <8 x i8>, <8 x i8>* %13
%15 = bitcast i8* %11 to <8 x i8>*
%16 = load <8 x i8>, <8 x i8>* %15
%17 = bitcast i8* %10 to <8 x i8>*
%18 = load <8 x i8>, <8 x i8>* %17
%19 = shufflevector <8 x i8> %14, <8 x i8> poison, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
%20 = shufflevector <8 x i8> %18, <8 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
%21 = shufflevector <16 x i8> %19, <16 x i8> %20, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23>
%22 = zext <16 x i8> %21 to <16 x i32>
%23 = shl nuw nsw <16 x i32> %22, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
%24 = bitcast i8* %12 to <8 x i8>*
%25 = load <8 x i8>, <8 x i8>* %24
%26 = shufflevector <8 x i8> %16, <8 x i8> poison, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
%27 = shufflevector <8 x i8> %25, <8 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
%28 = shufflevector <16 x i8> %26, <16 x i8> %27, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23>
%29 = zext <16 x i8> %28 to <16 x i32>
%30 = shufflevector <16 x i32> %22, <16 x i32> undef, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%31 = add nuw nsw <16 x i32> %30, %29
%32 = sub nsw <16 x i32> %23, %31
%33 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %32, i1 true)
%34 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %33)
%35 = add i32 %34, %7
%36 = getelementptr inbounds i8, i8* %10, i64 %4
%37 = add nsw i32 %8, -1
%38 = icmp eq i32 %37, 0
br i1 %38, label %39, label %6
39: ; preds = %6
ret i32 %35
}