void vOneTwoX(const unsigned char *psIn, int iLength, unsigned char *psOut) {
  int iCounter;
  for (iCounter = 0; iCounter < iLength; iCounter++) {
    psOut[2 * iCounter] = 0x30 + (((psIn[iCounter] >> 4)) & 0x0F);
    psOut[2 * iCounter + 1] = 0x30 + (psIn[iCounter] & 0x0F);
  }
}


x86 assembly (clang, -O0):
<vOneTwoX>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    117e <vOneTwoX+0x7e>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sar    $0x4,%eax
and    $0xf,%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xf,%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1116 <vOneTwoX+0x16>
pop    %rbp
ret

x86 assembly (clang, -O2):
<vOneTwoX>:
test   %esi,%esi
jle    1280 <vOneTwoX+0x180>
mov    %esi,%r9d
cmp    $0x8,%esi
jb     1126 <vOneTwoX+0x26>
lea    (%rdi,%r9,1),%rax
cmp    %rdx,%rax
jbe    11a1 <vOneTwoX+0xa1>
lea    (%rdx,%r9,2),%rax
cmp    %rdi,%rax
jbe    11a1 <vOneTwoX+0xa1>
xor    %ecx,%ecx
mov    %rcx,%rsi
not    %rsi
test   $0x1,%r9b
je     114e <vOneTwoX+0x4e>
mov    (%rdi,%rcx,1),%al
shr    $0x4,%al
or     $0x30,%al
mov    %al,(%rdx,%rcx,2)
mov    (%rdi,%rcx,1),%al
and    $0xf,%al
or     $0x30,%al
mov    %al,0x1(%rdx,%rcx,2)
or     $0x1,%rcx
add    %r9,%rsi
je     1280 <vOneTwoX+0x180>
nopw   0x0(%rax,%rax,1)
movzbl (%rdi,%rcx,1),%eax
shr    $0x4,%al
or     $0x30,%al
mov    %al,(%rdx,%rcx,2)
movzbl (%rdi,%rcx,1),%eax
and    $0xf,%al
or     $0x30,%al
mov    %al,0x1(%rdx,%rcx,2)
movzbl 0x1(%rdi,%rcx,1),%eax
shr    $0x4,%al
or     $0x30,%al
mov    %al,0x2(%rdx,%rcx,2)
movzbl 0x1(%rdi,%rcx,1),%eax
and    $0xf,%al
or     $0x30,%al
mov    %al,0x3(%rdx,%rcx,2)
add    $0x2,%rcx
cmp    %rcx,%r9
jne    1160 <vOneTwoX+0x60>
jmp    1280 <vOneTwoX+0x180>
mov    %r9d,%ecx
and    $0xfffffff8,%ecx
lea    -0x8(%rcx),%rax
mov    %rax,%r8
shr    $0x3,%r8
add    $0x1,%r8
test   %rax,%rax
je     1281 <vOneTwoX+0x181>
mov    %r8,%rax
and    $0xfffffffffffffffe,%rax
xor    %esi,%esi
movdqa 0xe30(%rip),%xmm0
movdqa 0xe38(%rip),%xmm1
movdqa 0xe40(%rip),%xmm2
movq   (%rdi,%rsi,1),%xmm3
movdqa %xmm3,%xmm4
psrlw  $0x4,%xmm4
pand   %xmm0,%xmm4
por    %xmm1,%xmm4
pand   %xmm2,%xmm3
por    %xmm1,%xmm3
punpcklbw %xmm3,%xmm4
movdqu %xmm4,(%rdx,%rsi,2)
movq   0x8(%rdi,%rsi,1),%xmm3
movdqa %xmm3,%xmm4
psrlw  $0x4,%xmm4
pand   %xmm0,%xmm4
por    %xmm1,%xmm4
pand   %xmm2,%xmm3
por    %xmm1,%xmm3
punpcklbw %xmm3,%xmm4
movdqu %xmm4,0x10(%rdx,%rsi,2)
add    $0x10,%rsi
add    $0xfffffffffffffffe,%rax
jne    11e0 <vOneTwoX+0xe0>
test   $0x1,%r8b
je     1277 <vOneTwoX+0x177>
movq   (%rdi,%rsi,1),%xmm0
movdqa %xmm0,%xmm1
psrlw  $0x4,%xmm1
pand   0xdaa(%rip),%xmm1
movdqa 0xdb2(%rip),%xmm2
pand   0xdba(%rip),%xmm0
por    %xmm2,%xmm1
por    %xmm2,%xmm0
punpcklbw %xmm0,%xmm1
movdqu %xmm1,(%rdx,%rsi,2)
cmp    %r9,%rcx
jne    1128 <vOneTwoX+0x28>
ret
xor    %esi,%esi
test   $0x1,%r8b
jne    1240 <vOneTwoX+0x140>
jmp    1277 <vOneTwoX+0x177>

LLVM IR (-O0):
define void @vOneTwoX(i8* %0, i32 %1, i8* %2) {
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i32
store i8* %0, i8** %4
store i32 %1, i32* %5
store i8* %2, i8** %6
store i32 0, i32* %7
br label %8
8: ; preds = %43, %3
%9 = load i32, i32* %7
%10 = load i32, i32* %5
%11 = icmp slt i32 %9, %10
br i1 %11, label %12, label %46
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 = ashr i32 %18, 4
%20 = and i32 %19, 15
%21 = add nsw i32 48, %20
%22 = trunc i32 %21 to i8
%23 = load i8*, i8** %6
%24 = load i32, i32* %7
%25 = mul nsw i32 2, %24
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i8, i8* %23, i64 %26
store i8 %22, i8* %27
%28 = load i8*, i8** %4
%29 = load i32, i32* %7
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i8, i8* %28, i64 %30
%32 = load i8, i8* %31
%33 = zext i8 %32 to i32
%34 = and i32 %33, 15
%35 = add nsw i32 48, %34
%36 = trunc i32 %35 to i8
%37 = load i8*, i8** %6
%38 = load i32, i32* %7
%39 = mul nsw i32 2, %38
%40 = add nsw i32 %39, 1
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i8, i8* %37, i64 %41
store i8 %36, i8* %42
br label %43
43: ; preds = %12
%44 = load i32, i32* %7
%45 = add nsw i32 %44, 1
store i32 %45, i32* %7
br label %8
46: ; preds = %8
ret void
}

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