void codifica(unsigned char *buffer, int tamanho, unsigned chave) {
  int i;
  for (i = 0; i < tamanho; i++) {
    buffer[i] = !(buffer[i] + chave);
  }
}


x86 assembly (clang, -O0):
<codifica>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1158 <codifica+0x58>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
add    -0x10(%rbp),%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1115 <codifica+0x15>
pop    %rbp
ret

x86 assembly (clang, -O2):
<codifica>:
test   %esi,%esi
jle    13d3 <codifica+0x2d3>
neg    %edx
mov    %esi,%r9d
cmp    $0x8,%esi
jae    1119 <codifica+0x19>
xor    %ecx,%ecx
jmp    13c0 <codifica+0x2c0>
movd   %edx,%xmm8
cmp    $0x10,%esi
jae    112a <codifica+0x2a>
xor    %ecx,%ecx
jmp    1362 <codifica+0x262>
mov    %r9d,%ecx
and    $0xfffffff0,%ecx
pshufd $0x0,%xmm8,%xmm1
lea    -0x10(%rcx),%rsi
mov    %rsi,%rax
shr    $0x4,%rax
add    $0x1,%rax
mov    %eax,%r8d
and    $0x3,%r8d
cmp    $0x30,%rsi
jae    1159 <codifica+0x59>
xor    %esi,%esi
jmp    12d8 <codifica+0x1d8>
and    $0xfffffffffffffffc,%rax
xor    %esi,%esi
pxor   %xmm10,%xmm10
movdqa 0xe93(%rip),%xmm9
nopl   (%rax)
movdqu (%rdi,%rsi,1),%xmm7
movdqu 0x10(%rdi,%rsi,1),%xmm6
movdqu 0x20(%rdi,%rsi,1),%xmm5
movdqu 0x30(%rdi,%rsi,1),%xmm4
movdqa %xmm7,%xmm3
punpcklbw %xmm10,%xmm3
movdqa %xmm3,%xmm0
punpcklwd %xmm10,%xmm0
punpckhwd %xmm10,%xmm3
punpckhbw %xmm10,%xmm7
movdqa %xmm7,%xmm2
punpcklwd %xmm10,%xmm2
punpckhwd %xmm10,%xmm7
pcmpeqd %xmm1,%xmm7
pcmpeqd %xmm1,%xmm2
packssdw %xmm7,%xmm2
pcmpeqd %xmm1,%xmm3
pcmpeqd %xmm1,%xmm0
packssdw %xmm3,%xmm0
packsswb %xmm2,%xmm0
pand   %xmm9,%xmm0
movdqu %xmm0,(%rdi,%rsi,1)
movdqa %xmm6,%xmm0
punpcklbw %xmm10,%xmm0
movdqa %xmm0,%xmm2
punpcklwd %xmm10,%xmm2
punpckhwd %xmm10,%xmm0
punpckhbw %xmm10,%xmm6
movdqa %xmm6,%xmm3
punpcklwd %xmm10,%xmm3
punpckhwd %xmm10,%xmm6
pcmpeqd %xmm1,%xmm6
pcmpeqd %xmm1,%xmm3
packssdw %xmm6,%xmm3
pcmpeqd %xmm1,%xmm0
pcmpeqd %xmm1,%xmm2
packssdw %xmm0,%xmm2
packsswb %xmm3,%xmm2
pand   %xmm9,%xmm2
movdqu %xmm2,0x10(%rdi,%rsi,1)
movdqa %xmm5,%xmm0
punpcklbw %xmm10,%xmm0
movdqa %xmm0,%xmm2
punpcklwd %xmm10,%xmm2
punpckhwd %xmm10,%xmm0
punpckhbw %xmm10,%xmm5
movdqa %xmm5,%xmm3
punpcklwd %xmm10,%xmm3
punpckhwd %xmm10,%xmm5
pcmpeqd %xmm1,%xmm5
pcmpeqd %xmm1,%xmm3
packssdw %xmm5,%xmm3
pcmpeqd %xmm1,%xmm0
pcmpeqd %xmm1,%xmm2
packssdw %xmm0,%xmm2
packsswb %xmm3,%xmm2
pand   %xmm9,%xmm2
movdqu %xmm2,0x20(%rdi,%rsi,1)
movdqa %xmm4,%xmm0
punpcklbw %xmm10,%xmm0
movdqa %xmm0,%xmm2
punpcklwd %xmm10,%xmm2
punpckhwd %xmm10,%xmm0
punpckhbw %xmm10,%xmm4
movdqa %xmm4,%xmm3
punpcklwd %xmm10,%xmm3
punpckhwd %xmm10,%xmm4
pcmpeqd %xmm1,%xmm4
pcmpeqd %xmm1,%xmm3
packssdw %xmm4,%xmm3
pcmpeqd %xmm1,%xmm0
pcmpeqd %xmm1,%xmm2
packssdw %xmm0,%xmm2
packsswb %xmm3,%xmm2
pand   %xmm9,%xmm2
movdqu %xmm2,0x30(%rdi,%rsi,1)
add    $0x40,%rsi
add    $0xfffffffffffffffc,%rax
jne    1170 <codifica+0x70>
test   %r8,%r8
je     1357 <codifica+0x257>
add    %rdi,%rsi
shl    $0x4,%r8
xor    %eax,%eax
pxor   %xmm2,%xmm2
movdqa 0xd0e(%rip),%xmm3
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqu (%rsi,%rax,1),%xmm0
movdqa %xmm0,%xmm4
punpcklbw %xmm2,%xmm4
movdqa %xmm4,%xmm5
punpcklwd %xmm2,%xmm5
punpckhwd %xmm2,%xmm4
punpckhbw %xmm2,%xmm0
movdqa %xmm0,%xmm6
punpcklwd %xmm2,%xmm6
punpckhwd %xmm2,%xmm0
pcmpeqd %xmm1,%xmm0
pcmpeqd %xmm1,%xmm6
packssdw %xmm0,%xmm6
pcmpeqd %xmm1,%xmm4
pcmpeqd %xmm1,%xmm5
packssdw %xmm4,%xmm5
packsswb %xmm6,%xmm5
pand   %xmm3,%xmm5
movdqu %xmm5,(%rsi,%rax,1)
add    $0x10,%rax
cmp    %rax,%r8
jne    1300 <codifica+0x200>
cmp    %r9,%rcx
je     13d3 <codifica+0x2d3>
test   $0x8,%r9b
je     13c0 <codifica+0x2c0>
mov    %rcx,%rax
mov    %r9d,%ecx
and    $0xfffffff8,%ecx
pshufd $0x0,%xmm8,%xmm0
pxor   %xmm1,%xmm1
movdqa 0xc93(%rip),%xmm2
nopl   (%rax)
movq   (%rdi,%rax,1),%xmm3
punpcklbw %xmm1,%xmm3
movdqa %xmm3,%xmm4
punpcklwd %xmm1,%xmm4
punpckhwd %xmm1,%xmm3
pcmpeqd %xmm0,%xmm3
pcmpeqd %xmm0,%xmm4
packssdw %xmm3,%xmm4
packsswb %xmm4,%xmm4
pand   %xmm2,%xmm4
movq   %xmm4,(%rdi,%rax,1)
add    $0x8,%rax
cmp    %rax,%rcx
jne    1380 <codifica+0x280>
cmp    %r9,%rcx
je     13d3 <codifica+0x2d3>
nopl   0x0(%rax)
movzbl (%rdi,%rcx,1),%eax
cmp    %edx,%eax
sete   (%rdi,%rcx,1)
add    $0x1,%rcx
cmp    %rcx,%r9
jne    13c0 <codifica+0x2c0>
ret

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

LLVM IR (-O2):
define void @codifica(i8* nocapture %0, i32 %1, i32 %2) {
%4 = icmp sgt i32 %1, 0
br i1 %4, label %5, label %109
5: ; preds = %3
%6 = sub i32 0, %2
%7 = zext i32 %1 to i64
%8 = icmp ult i32 %1, 8
br i1 %8, label %98, label %9
9: ; preds = %5
%10 = icmp ult i32 %1, 16
br i1 %10, label %80, label %11
11: ; preds = %9
%12 = and i64 %7, 4294967280
%13 = insertelement <16 x i32> poison, i32 %6, i64 0
%14 = shufflevector <16 x i32> %13, <16 x i32> poison, <16 x i32> zeroinitializer
%15 = add nsw i64 %12, -16
%16 = lshr exact i64 %15, 4
%17 = add nuw nsw i64 %16, 1
%18 = and i64 %17, 3
%19 = icmp ult i64 %15, 48
br i1 %19, label %59, label %20
20: ; preds = %11
%21 = and i64 %17, 2305843009213693948
br label %22
22: ; preds = %22, %20
%23 = phi i64 [ 0, %20 ], [ %56, %22 ]
%24 = phi i64 [ 0, %20 ], [ %57, %22 ]
%25 = getelementptr inbounds i8, i8* %0, i64 %23
%26 = bitcast i8* %25 to <16 x i8>*
%27 = load <16 x i8>, <16 x i8>* %26
%28 = zext <16 x i8> %27 to <16 x i32>
%29 = icmp eq <16 x i32> %14, %28
%30 = zext <16 x i1> %29 to <16 x i8>
%31 = bitcast i8* %25 to <16 x i8>*
store <16 x i8> %30, <16 x i8>* %31
%32 = or i64 %23, 16
%33 = getelementptr inbounds i8, i8* %0, i64 %32
%34 = bitcast i8* %33 to <16 x i8>*
%35 = load <16 x i8>, <16 x i8>* %34
%36 = zext <16 x i8> %35 to <16 x i32>
%37 = icmp eq <16 x i32> %14, %36
%38 = zext <16 x i1> %37 to <16 x i8>
%39 = bitcast i8* %33 to <16 x i8>*
store <16 x i8> %38, <16 x i8>* %39
%40 = or i64 %23, 32
%41 = getelementptr inbounds i8, i8* %0, i64 %40
%42 = bitcast i8* %41 to <16 x i8>*
%43 = load <16 x i8>, <16 x i8>* %42
%44 = zext <16 x i8> %43 to <16 x i32>
%45 = icmp eq <16 x i32> %14, %44
%46 = zext <16 x i1> %45 to <16 x i8>
%47 = bitcast i8* %41 to <16 x i8>*
store <16 x i8> %46, <16 x i8>* %47
%48 = or i64 %23, 48
%49 = getelementptr inbounds i8, i8* %0, i64 %48
%50 = bitcast i8* %49 to <16 x i8>*
%51 = load <16 x i8>, <16 x i8>* %50
%52 = zext <16 x i8> %51 to <16 x i32>
%53 = icmp eq <16 x i32> %14, %52
%54 = zext <16 x i1> %53 to <16 x i8>
%55 = bitcast i8* %49 to <16 x i8>*
store <16 x i8> %54, <16 x i8>* %55
%56 = add nuw i64 %23, 64
%57 = add i64 %24, 4
%58 = icmp eq i64 %57, %21
br i1 %58, label %59, label %22
59: ; preds = %22, %11
%60 = phi i64 [ 0, %11 ], [ %56, %22 ]
%61 = icmp eq i64 %18, 0
br i1 %61, label %75, label %62
62: ; preds = %59, %62
%63 = phi i64 [ %72, %62 ], [ %60, %59 ]
%64 = phi i64 [ %73, %62 ], [ 0, %59 ]
%65 = getelementptr inbounds i8, i8* %0, i64 %63
%66 = bitcast i8* %65 to <16 x i8>*
%67 = load <16 x i8>, <16 x i8>* %66
%68 = zext <16 x i8> %67 to <16 x i32>
%69 = icmp eq <16 x i32> %14, %68
%70 = zext <16 x i1> %69 to <16 x i8>
%71 = bitcast i8* %65 to <16 x i8>*
store <16 x i8> %70, <16 x i8>* %71
%72 = add nuw i64 %63, 16
%73 = add i64 %64, 1
%74 = icmp eq i64 %73, %18
br i1 %74, label %75, label %62
75: ; preds = %62, %59
%76 = icmp eq i64 %12, %7
br i1 %76, label %109, label %77
77: ; preds = %75
%78 = and i64 %7, 8
%79 = icmp eq i64 %78, 0
br i1 %79, label %98, label %80
80: ; preds = %9, %77
%81 = phi i64 [ %12, %77 ], [ 0, %9 ]
%82 = and i64 %7, 4294967288
%83 = insertelement <8 x i32> poison, i32 %6, i64 0
%84 = shufflevector <8 x i32> %83, <8 x i32> poison, <8 x i32> zeroinitializer
br label %85
85: ; preds = %85, %80
%86 = phi i64 [ %81, %80 ], [ %94, %85 ]
%87 = getelementptr inbounds i8, i8* %0, i64 %86
%88 = bitcast i8* %87 to <8 x i8>*
%89 = load <8 x i8>, <8 x i8>* %88
%90 = zext <8 x i8> %89 to <8 x i32>
%91 = icmp eq <8 x i32> %84, %90
%92 = zext <8 x i1> %91 to <8 x i8>
%93 = bitcast i8* %87 to <8 x i8>*
store <8 x i8> %92, <8 x i8>* %93
%94 = add nuw i64 %86, 8
%95 = icmp eq i64 %94, %82
br i1 %95, label %96, label %85
96: ; preds = %85
%97 = icmp eq i64 %82, %7
br i1 %97, label %109, label %98
98: ; preds = %5, %77, %96
%99 = phi i64 [ 0, %5 ], [ %12, %77 ], [ %82, %96 ]
br label %100
100: ; preds = %98, %100
%101 = phi i64 [ %107, %100 ], [ %99, %98 ]
%102 = getelementptr inbounds i8, i8* %0, i64 %101
%103 = load i8, i8* %102
%104 = zext i8 %103 to i32
%105 = icmp eq i32 %104, %6
%106 = zext i1 %105 to i8
store i8 %106, i8* %102
%107 = add nuw nsw i64 %101, 1
%108 = icmp eq i64 %107, %7
br i1 %108, label %109, label %100
109: ; preds = %100, %75, %96, %3
ret void
}