void mirrorV(int w, int h, char *pattern, char *result) {
  for (int y = 0; y < h; y++)
    for (int x = 0; x < w; x++)
      result[x + y * w] = pattern[w - x - 1 + y * w];
  result[w * h] = '\0';
}


x86 assembly (clang, -O0):
<mirrorV>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    118b <mirrorV+0x8b>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1178 <mirrorV+0x78>
mov    -0x10(%rbp),%rax
mov    -0x4(%rbp),%ecx
sub    -0x20(%rbp),%ecx
sub    $0x1,%ecx
mov    -0x1c(%rbp),%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    -0x1c(%rbp),%esi
imul   -0x4(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    112c <mirrorV+0x2c>
jmp    117d <mirrorV+0x7d>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1119 <mirrorV+0x19>
mov    -0x18(%rbp),%rax
mov    -0x4(%rbp),%ecx
imul   -0x8(%rbp),%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
pop    %rbp
ret

x86 assembly (clang, -O2):
<mirrorV>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rcx,-0x38(%rsp)
mov    %esi,-0x3c(%rsp)
test   %esi,%esi
jle    13b3 <mirrorV+0x2b3>
movslq %edi,%r9
mov    -0x3c(%rsp),%eax
mov    %rax,-0x8(%rsp)
mov    %r9d,%r12d
lea    -0x1(%r12),%rax
mov    %rax,-0x10(%rsp)
lea    -0x1(%r9),%r8d
mov    %rdx,%rax
sub    %r12,%rax
add    $0x1,%rax
mov    %rax,-0x20(%rsp)
lea    0x1(%rdx),%rax
mov    %rax,-0x18(%rsp)
mov    %r12d,%eax
and    $0xffffffe0,%eax
mov    %rax,-0x28(%rsp)
mov    %r12d,%r13d
and    $0xfffffff8,%r13d
mov    %r12,%rax
mov    %r12,-0x48(%rsp)
neg    %r12
mov    -0x38(%rsp),%rcx
lea    0x10(%rcx),%rbp
lea    -0x2(%r9),%r14d
xor    %r15d,%r15d
pxor   %xmm0,%xmm0
mov    %r8d,-0x2c(%rsp)
jmp    11ab <mirrorV+0xab>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r15
add    %r9,%rbp
add    %edi,%r8d
add    %r9,%rcx
add    %edi,%r14d
cmp    -0x8(%rsp),%r15
je     13b3 <mirrorV+0x2b3>
test   %edi,%edi
jle    1190 <mirrorV+0x90>
mov    %r15,%r10
imul   %r9,%r10
cmp    $0x8,%edi
jb     1220 <mirrorV+0x120>
mov    %r15d,%esi
imul   %edi,%esi
add    -0x2c(%rsp),%esi
mov    %esi,%eax
mov    -0x10(%rsp),%rbx
sub    %ebx,%eax
cmp    %esi,%eax
jg     1220 <mirrorV+0x120>
mov    %rbx,%rax
shr    $0x20,%rax
mov    $0x0,%eax
jne    1222 <mirrorV+0x122>
mov    -0x38(%rsp),%rbx
lea    (%rbx,%r10,1),%r11
movslq %esi,%rax
mov    -0x18(%rsp),%rsi
add    %rax,%rsi
cmp    %rsi,%r11
jae    129d <mirrorV+0x19d>
mov    -0x48(%rsp),%rsi
add    %r10,%rsi
add    %rbx,%rsi
add    -0x20(%rsp),%rax
cmp    %rsi,%rax
jae    129d <mirrorV+0x19d>
cs nopw 0x0(%rax,%rax,1)
xor    %eax,%eax
mov    %rax,%r11
testb  $0x1,-0x48(%rsp)
je     124f <mirrorV+0x14f>
mov    %eax,%esi
not    %esi
add    %r10d,%esi
add    %edi,%esi
movslq %esi,%rsi
mov    (%rdx,%rsi,1),%sil
add    %rax,%r10
mov    -0x38(%rsp),%rbx
mov    %sil,(%rbx,%r10,1)
mov    %rax,%r11
or     $0x1,%r11
not    %rax
cmp    %r12,%rax
je     1190 <mirrorV+0x90>
mov    %r8d,%eax
sub    %r11d,%eax
mov    %r14d,%esi
sub    %r11d,%esi
nopw   0x0(%rax,%rax,1)
cltq
movzbl (%rdx,%rax,1),%ebx
mov    %bl,(%rcx,%r11,1)
movslq %esi,%rsi
movzbl (%rdx,%rsi,1),%ebx
mov    %bl,0x1(%rcx,%r11,1)
add    $0x2,%r11
add    $0xfffffffe,%eax
add    $0xfffffffe,%esi
mov    %r12,%rbx
add    %r11,%rbx
jne    1270 <mirrorV+0x170>
jmp    1190 <mirrorV+0x90>
cmp    $0x20,%edi
jae    12a9 <mirrorV+0x1a9>
xor    %esi,%esi
jmp    1364 <mirrorV+0x264>
mov    %r8d,%eax
xor    %esi,%esi
mov    -0x28(%rsp),%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cltq
movdqu -0x1f(%rdx,%rax,1),%xmm1
movdqu -0xf(%rdx,%rax,1),%xmm2
movdqa %xmm2,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm3,%xmm2
movdqa %xmm1,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm3,%xmm1
movdqu %xmm2,-0x10(%rbp,%rsi,1)
movdqu %xmm1,0x0(%rbp,%rsi,1)
add    $0x20,%rsi
add    $0xffffffe0,%eax
cmp    %rsi,%rbx
jne    12c0 <mirrorV+0x1c0>
cmp    -0x48(%rsp),%rbx
je     1190 <mirrorV+0x90>
mov    -0x28(%rsp),%rax
mov    %rax,%rsi
testb  $0x18,-0x48(%rsp)
je     1222 <mirrorV+0x122>
mov    %r8d,%eax
sub    %esi,%eax
nopl   0x0(%rax)
cltq
movq   -0x7(%rdx,%rax,1),%xmm1
punpcklbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm1,%xmm1
movq   %xmm1,(%rcx,%rsi,1)
add    $0x8,%rsi
add    $0xfffffff8,%eax
cmp    %rsi,%r13
jne    1370 <mirrorV+0x270>
mov    %r13,%rax
cmp    -0x48(%rsp),%r13
je     1190 <mirrorV+0x90>
jmp    1222 <mirrorV+0x122>
mov    -0x3c(%rsp),%eax
imul   %edi,%eax
cltq
mov    -0x38(%rsp),%rcx
movb   $0x0,(%rcx,%rax,1)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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