void devredir_cvt_from_unicode_len(char *path, char *unicode, int len) {
  int i;
  int j;
  for (i = 0, j = 0; i < len; i += 2) {
    path[j++] = unicode[i];
  }
  path[j] = 0;
}


x86 assembly (clang, -O0):
<devredir_cvt_from_unicode_len>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1157 <devredir_cvt_from_unicode_len+0x57>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x1c(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x18(%rbp)
jmp    111d <devredir_cvt_from_unicode_len+0x1d>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
pop    %rbp
ret

x86 assembly (clang, -O2):
<devredir_cvt_from_unicode_len>:
push   %rbp
push   %r14
push   %rbx
test   %edx,%edx
jle    11cd <devredir_cvt_from_unicode_len+0xcd>
add    $0xffffffff,%edx
mov    %edx,%r9d
shr    %r9d
add    $0x1,%r9d
cmp    $0x10,%edx
jb     113c <devredir_cvt_from_unicode_len+0x3c>
lea    (%rsi,%r9,2),%rax
add    $0xffffffffffffffff,%rax
cmp    %rdi,%rax
jbe    11da <devredir_cvt_from_unicode_len+0xda>
lea    (%rdi,%r9,1),%rax
cmp    %rsi,%rax
jbe    11da <devredir_cvt_from_unicode_len+0xda>
xor    %edx,%edx
xor    %ecx,%ecx
mov    %r9d,%eax
sub    %ecx,%eax
mov    %rcx,%r8
not    %r8
add    %r9,%r8
and    $0x3,%rax
je     1175 <devredir_cvt_from_unicode_len+0x75>
add    %rax,%rax
nopw   0x0(%rax,%rax,1)
movzbl (%rsi,%rdx,1),%ebx
mov    %bl,(%rdi,%rcx,1)
add    $0x1,%rcx
add    $0x2,%rdx
add    $0xfffffffffffffffe,%rax
jne    1160 <devredir_cvt_from_unicode_len+0x60>
cmp    $0x3,%r8
jb     11d0 <devredir_cvt_from_unicode_len+0xd0>
lea    (%rdx,%rsi,1),%rax
add    $0x6,%rax
mov    %r9,%rdx
sub    %rcx,%rdx
add    %rdi,%rcx
add    $0x3,%rcx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl -0x6(%rax,%rsi,2),%ebx
mov    %bl,-0x3(%rcx,%rsi,1)
movzbl -0x4(%rax,%rsi,2),%ebx
mov    %bl,-0x2(%rcx,%rsi,1)
movzbl -0x2(%rax,%rsi,2),%ebx
mov    %bl,-0x1(%rcx,%rsi,1)
movzbl (%rax,%rsi,2),%ebx
mov    %bl,(%rcx,%rsi,1)
add    $0x4,%rsi
cmp    %rsi,%rdx
jne    11a0 <devredir_cvt_from_unicode_len+0xa0>
jmp    11d0 <devredir_cvt_from_unicode_len+0xd0>
xor    %r9d,%r9d
movb   $0x0,(%rdi,%r9,1)
pop    %rbx
pop    %r14
pop    %rbp
ret
cmp    $0x20,%edx
jae    11e6 <devredir_cvt_from_unicode_len+0xe6>
xor    %ecx,%ecx
jmp    12fe <devredir_cvt_from_unicode_len+0x1fe>
mov    %r9d,%eax
and    $0xf,%eax
test   %rax,%rax
mov    $0x10,%r8d
cmovne %rax,%r8
mov    %r9,%rcx
sub    %r8,%rcx
lea    -0x1(%rcx),%r10
mov    $0xffffffffffffffff,%rax
nopw   0x0(%rax,%rax,1)
movzbl 0x20(%rsi,%rax,2),%edx
movd   %edx,%xmm0
movzbl 0x1e(%rsi,%rax,2),%edx
movd   %edx,%xmm1
punpcklbw %xmm0,%xmm1
movzbl 0x1c(%rsi,%rax,2),%edx
movd   %edx,%xmm0
movzbl 0x1a(%rsi,%rax,2),%edx
movd   %edx,%xmm2
punpcklbw %xmm0,%xmm2
punpcklwd %xmm1,%xmm2
movzbl 0x18(%rsi,%rax,2),%edx
movd   %edx,%xmm0
movzbl 0x16(%rsi,%rax,2),%edx
movd   %edx,%xmm1
punpcklbw %xmm0,%xmm1
movzbl 0x14(%rsi,%rax,2),%edx
movd   %edx,%xmm3
movzbl 0x12(%rsi,%rax,2),%edx
movd   %edx,%xmm0
punpcklbw %xmm3,%xmm0
punpcklwd %xmm1,%xmm0
punpckldq %xmm2,%xmm0
movzbl 0x10(%rsi,%rax,2),%edx
movd   %edx,%xmm1
movzbl 0xe(%rsi,%rax,2),%edx
movd   %edx,%xmm2
punpcklbw %xmm1,%xmm2
movzbl 0xc(%rsi,%rax,2),%edx
movd   %edx,%xmm1
movzbl 0xa(%rsi,%rax,2),%edx
movd   %edx,%xmm3
punpcklbw %xmm1,%xmm3
punpcklwd %xmm2,%xmm3
movzbl 0x8(%rsi,%rax,2),%edx
movd   %edx,%xmm1
movzbl 0x6(%rsi,%rax,2),%edx
movd   %edx,%xmm2
punpcklbw %xmm1,%xmm2
movzbl 0x4(%rsi,%rax,2),%edx
movd   %edx,%xmm1
movzbl 0x2(%rsi,%rax,2),%edx
movd   %edx,%xmm4
punpcklbw %xmm1,%xmm4
punpcklwd %xmm2,%xmm4
punpckldq %xmm3,%xmm4
punpcklqdq %xmm0,%xmm4
movdqu %xmm4,0x1(%rdi,%rax,1)
add    $0x10,%rax
cmp    %rax,%r10
jne    1210 <devredir_cvt_from_unicode_len+0x110>
cmp    $0x9,%r8d
jae    12fe <devredir_cvt_from_unicode_len+0x1fe>
lea    (%rcx,%rcx,1),%rdx
jmp    1140 <devredir_cvt_from_unicode_len+0x40>
mov    %rcx,%rax
mov    %r9d,%ecx
and    $0x7,%ecx
test   %rcx,%rcx
mov    $0x8,%edx
cmovne %rcx,%rdx
mov    %r9,%rcx
sub    %rdx,%rcx
lea    (%rcx,%rcx,1),%rdx
nopl   (%rax)
movzbl (%rsi,%rax,2),%r8d
movzbl 0x4(%rsi,%rax,2),%r10d
movzbl 0x8(%rsi,%rax,2),%r11d
movzbl 0xc(%rsi,%rax,2),%r14d
movzbl 0x6(%rsi,%rax,2),%ebp
shl    $0x8,%ebp
or     %r10d,%ebp
movzbl 0x2(%rsi,%rax,2),%ebx
shl    $0x8,%ebx
or     %r8d,%ebx
movd   %ebx,%xmm0
pinsrw $0x1,%ebp,%xmm0
movzbl 0xa(%rsi,%rax,2),%ebp
shl    $0x8,%ebp
or     %r11d,%ebp
pinsrw $0x2,%ebp,%xmm0
movzbl 0xe(%rsi,%rax,2),%ebp
shl    $0x8,%ebp
or     %r14d,%ebp
pinsrw $0x3,%ebp,%xmm0
movq   %xmm0,(%rdi,%rax,1)
add    $0x8,%rax
cmp    %rax,%rcx
jne    1320 <devredir_cvt_from_unicode_len+0x220>
jmp    1140 <devredir_cvt_from_unicode_len+0x40>

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

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