void store_cols(char *card, int num, int beg, int len) {
  int i;
  for (i = len - 1; i >= 0; i--) {
    card[beg + i] = (num % 10) + '0';
    num /= 10;
  }
}


x86 assembly (clang, -O0):
<store_cols>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jl     115e <store_cols+0x5e>
mov    -0xc(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0xc(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0xc(%rbp)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    111a <store_cols+0x1a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<store_cols>:
test   %ecx,%ecx
jle    11cc <store_cols+0xcc>
mov    %ecx,%eax
movslq %edx,%r8
test   $0x1,%al
je     1146 <store_cols+0x46>
lea    (%rax,%r8,1),%r9
add    $0xffffffffffffffff,%r9
add    $0xffffffffffffffff,%rax
movslq %esi,%r11
imul   $0x66666667,%r11,%rsi
mov    %rsi,%r10
shr    $0x3f,%r10
sar    $0x22,%rsi
add    %r10d,%esi
lea    (%rsi,%rsi,1),%edx
lea    (%rdx,%rdx,4),%edx
sub    %edx,%r11d
add    $0x30,%r11b
mov    %r11b,(%rdi,%r9,1)
cmp    $0x1,%ecx
je     11cc <store_cols+0xcc>
add    %r8,%rdi
add    $0x1,%rax
cs nopw 0x0(%rax,%rax,1)
movslq %esi,%rdx
imul   $0x66666667,%rdx,%rcx
mov    %rcx,%rsi
shr    $0x3f,%rsi
sar    $0x22,%rcx
add    %esi,%ecx
lea    (%rcx,%rcx,1),%esi
lea    (%rsi,%rsi,4),%r8d
imul   $0x51eb851f,%rdx,%rsi
sub    %r8d,%edx
add    $0x30,%dl
mov    %dl,-0x2(%rdi,%rax,1)
movslq %ecx,%rcx
imul   $0x66666667,%rcx,%rdx
mov    %rdx,%r8
shr    $0x3f,%r8
sar    $0x22,%rdx
add    %r8d,%edx
add    %edx,%edx
lea    (%rdx,%rdx,4),%edx
sub    %edx,%ecx
add    $0x30,%cl
mov    %cl,-0x3(%rdi,%rax,1)
mov    %rsi,%rcx
shr    $0x3f,%rcx
sar    $0x25,%rsi
add    %ecx,%esi
add    $0xfffffffffffffffe,%rax
cmp    $0x1,%rax
ja     1160 <store_cols+0x60>
ret

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

LLVM IR (-O2):
define void @store_cols(i8* nocapture writeonly %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp sgt i32 %3, 0
br i1 %5, label %6, label %41
6: ; preds = %4
%7 = zext i32 %3 to i64
%8 = sext i32 %2 to i64
%9 = and i64 %7, 1
%10 = icmp eq i64 %9, 0
br i1 %10, label %19, label %11
11: ; preds = %6
%12 = add nsw i64 %7, -1
%13 = srem i32 %1, 10
%14 = trunc i32 %13 to i8
%15 = add nsw i8 %14, 48
%16 = add nsw i64 %12, %8
%17 = getelementptr inbounds i8, i8* %0, i64 %16
store i8 %15, i8* %17
%18 = sdiv i32 %1, 10
br label %19
19: ; preds = %11, %6
%20 = phi i64 [ %7, %6 ], [ %12, %11 ]
%21 = phi i32 [ %1, %6 ], [ %18, %11 ]
%22 = icmp eq i32 %3, 1
br i1 %22, label %41, label %23
23: ; preds = %19, %23
%24 = phi i64 [ %33, %23 ], [ %20, %19 ]
%25 = phi i32 [ %39, %23 ], [ %21, %19 ]
%26 = add nsw i64 %24, -1
%27 = srem i32 %25, 10
%28 = trunc i32 %27 to i8
%29 = add nsw i8 %28, 48
%30 = add nsw i64 %26, %8
%31 = getelementptr inbounds i8, i8* %0, i64 %30
store i8 %29, i8* %31
%32 = sdiv i32 %25, 10
%33 = add nsw i64 %24, -2
%34 = srem i32 %32, 10
%35 = trunc i32 %34 to i8
%36 = add nsw i8 %35, 48
%37 = add nsw i64 %33, %8
%38 = getelementptr inbounds i8, i8* %0, i64 %37
store i8 %36, i8* %38
%39 = sdiv i32 %25, 100
%40 = icmp ugt i64 %26, 1
br i1 %40, label %23, label %41
41: ; preds = %19, %23, %4
ret void
}