void set_bytes_u(unsigned long in, int numbytes, unsigned char *out) {
  int i;
  for (i = 0; i < numbytes; i++) {
    out[numbytes - 1 - i] = (in << (sizeof(unsigned long) - (i + 1)) * 8) >>
                            (sizeof(unsigned long) - 1) * 8;
  }
}


x86 assembly (clang, -O0):
<set_bytes_u>:
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    1165 <set_bytes_u+0x65>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rdx
mov    $0x8,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
shl    %cl,%rax
shr    $0x38,%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1116 <set_bytes_u+0x16>
pop    %rbp
ret

x86 assembly (clang, -O2):
<set_bytes_u>:
test   %esi,%esi
jle    14ea <set_bytes_u+0x3ea>
mov    %esi,%r8d
cmp    $0x10,%esi
jae    1118 <set_bytes_u+0x18>
xor    %r9d,%r9d
jmp    144e <set_bytes_u+0x34e>
lea    -0x1(%r8),%r10
lea    -0x1(%rsi),%eax
mov    %eax,%ecx
sub    %r10d,%ecx
xor    %r9d,%r9d
cmp    %eax,%ecx
jg     144e <set_bytes_u+0x34e>
shr    $0x20,%r10
jne    144e <set_bytes_u+0x34e>
mov    %r8d,%r9d
and    $0xfffffff0,%r9d
movq   %rdi,%xmm0
pshufd $0x44,%xmm0,%xmm8
movdqa 0xead(%rip),%xmm2
movdqa 0xeb4(%rip),%xmm13
movdqa 0xebb(%rip),%xmm10
movdqa 0xec3(%rip),%xmm3
movdqa 0xecb(%rip),%xmm5
movdqa 0xed3(%rip),%xmm6
movdqa 0xedb(%rip),%xmm1
movdqa 0xee3(%rip),%xmm0
mov    %r9,%rcx
pcmpeqd %xmm9,%xmm9
movdqa 0xee2(%rip),%xmm15
xchg   %ax,%ax
movdqa %xmm0,-0x78(%rsp)
movdqa %xmm1,-0x18(%rsp)
movdqa %xmm6,-0x68(%rsp)
movdqa %xmm5,-0x58(%rsp)
movdqa %xmm3,-0x48(%rsp)
movdqa %xmm10,-0x38(%rsp)
movdqa %xmm2,-0x28(%rsp)
movdqa -0x28(%rsp),%xmm2
pxor   %xmm9,%xmm2
movdqa -0x48(%rsp),%xmm4
pxor   %xmm9,%xmm4
movdqa -0x38(%rsp),%xmm14
pxor   %xmm9,%xmm14
movdqa -0x68(%rsp),%xmm6
pxor   %xmm9,%xmm6
movdqa -0x58(%rsp),%xmm5
pxor   %xmm9,%xmm5
movdqa -0x78(%rsp),%xmm0
pxor   %xmm9,%xmm0
movdqa %xmm1,%xmm3
pxor   %xmm9,%xmm3
psllq  $0x3,%xmm3
psllq  $0x3,%xmm0
psllq  $0x3,%xmm5
psllq  $0x3,%xmm6
psllq  $0x3,%xmm14
psllq  $0x3,%xmm4
psllq  $0x3,%xmm2
paddq  %xmm15,%xmm2
paddq  %xmm15,%xmm4
paddq  %xmm15,%xmm14
paddq  %xmm15,%xmm3
movdqa %xmm8,%xmm12
psllq  %xmm3,%xmm12
paddq  %xmm15,%xmm5
pshufd $0xee,%xmm3,%xmm7
movdqa %xmm8,%xmm3
psllq  %xmm7,%xmm3
paddq  %xmm15,%xmm0
movdqa %xmm8,%xmm7
psllq  %xmm0,%xmm7
pshufd $0xee,%xmm0,%xmm1
movdqa %xmm8,%xmm0
psllq  %xmm1,%xmm0
movdqa %xmm8,%xmm1
psllq  %xmm5,%xmm1
paddq  %xmm15,%xmm6
pshufd $0xee,%xmm5,%xmm5
movdqa %xmm8,%xmm11
psllq  %xmm5,%xmm11
movsd  %xmm12,%xmm3
movdqa %xmm8,%xmm12
psllq  %xmm6,%xmm12
pshufd $0xee,%xmm6,%xmm5
movdqa %xmm8,%xmm6
psllq  %xmm5,%xmm6
movdqa %xmm13,%xmm10
movdqa %xmm8,%xmm13
psllq  %xmm14,%xmm13
movsd  %xmm7,%xmm0
pshufd $0xee,%xmm14,%xmm7
movdqa %xmm8,%xmm5
psllq  %xmm7,%xmm5
movsd  %xmm1,%xmm11
movdqa %xmm8,%xmm14
psllq  %xmm4,%xmm14
pshufd $0xee,%xmm4,%xmm7
movdqa %xmm8,%xmm4
psllq  %xmm7,%xmm4
movdqa %xmm8,%xmm7
psllq  %xmm2,%xmm7
movsd  %xmm12,%xmm6
pshufd $0xee,%xmm2,%xmm12
movdqa %xmm8,%xmm2
psllq  %xmm12,%xmm2
movsd  %xmm13,%xmm5
movdqa %xmm10,%xmm13
movdqa %xmm10,%xmm1
pxor   %xmm9,%xmm1
psllq  $0x3,%xmm1
paddq  %xmm15,%xmm1
movsd  %xmm14,%xmm4
movdqa -0x38(%rsp),%xmm10
movsd  %xmm7,%xmm2
movdqa %xmm8,%xmm7
psllq  %xmm1,%xmm7
pshufd $0xee,%xmm1,%xmm12
movdqa %xmm8,%xmm1
psllq  %xmm12,%xmm1
movsd  %xmm7,%xmm1
psrlq  $0x38,%xmm1
psrlq  $0x38,%xmm2
packuswb %xmm2,%xmm1
movdqa -0x28(%rsp),%xmm2
psrlq  $0x38,%xmm4
psrlq  $0x38,%xmm5
packuswb %xmm5,%xmm4
movdqa -0x58(%rsp),%xmm5
packuswb %xmm1,%xmm4
psrlq  $0x38,%xmm6
psrlq  $0x38,%xmm11
packuswb %xmm11,%xmm6
psrlq  $0x38,%xmm0
psrlq  $0x38,%xmm3
packuswb %xmm3,%xmm0
packuswb %xmm6,%xmm0
movdqa -0x68(%rsp),%xmm6
packuswb %xmm4,%xmm0
movdqa -0x48(%rsp),%xmm3
movdqa %xmm0,%xmm1
pxor   %xmm4,%xmm4
punpcklbw %xmm4,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
punpckhbw %xmm4,%xmm0
pshufd $0x4e,%xmm0,%xmm0
pshuflw $0x1b,%xmm0,%xmm0
pshufhw $0x1b,%xmm0,%xmm0
packuswb %xmm1,%xmm0
movdqa -0x18(%rsp),%xmm1
cltq
movdqu %xmm0,-0xf(%rdx,%rax,1)
movdqa -0x78(%rsp),%xmm0
movdqa 0xc7a(%rip),%xmm4
paddq  %xmm4,%xmm0
paddq  %xmm4,%xmm1
paddq  %xmm4,%xmm6
paddq  %xmm4,%xmm5
paddq  %xmm4,%xmm3
paddq  %xmm4,%xmm10
paddq  %xmm4,%xmm13
paddq  %xmm4,%xmm2
add    $0xfffffff0,%eax
add    $0xfffffffffffffff0,%rcx
jne    11a0 <set_bytes_u+0xa0>
cmp    %r8,%r9
je     14ea <set_bytes_u+0x3ea>
mov    %r9,%rax
not    %rax
test   $0x1,%r8b
je     1485 <set_bytes_u+0x385>
mov    %r9,%r10
or     $0x1,%r10
lea    0x0(,%r10,8),%ecx
neg    %cl
mov    %rdi,%r11
shl    %cl,%r11
shr    $0x38,%r11
not    %r9d
add    %esi,%r9d
movslq %r9d,%rcx
mov    %r11b,(%rdx,%rcx,1)
mov    %r10,%r9
add    %r8,%rax
je     14ea <set_bytes_u+0x3ea>
sub    %r9,%r8
lea    0x0(,%r9,8),%rcx
mov    $0x30,%r10d
sub    %rcx,%r10
not    %r9d
add    %esi,%r9d
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    0x8(%r10),%ecx
mov    %rdi,%rsi
shl    %cl,%rsi
shr    $0x38,%rsi
movslq %r9d,%r9
mov    %rdi,%rax
mov    %r10d,%ecx
shl    %cl,%rax
mov    %sil,(%rdx,%r9,1)
shr    $0x38,%rax
lea    -0x1(%r9),%ecx
movslq %ecx,%rcx
mov    %al,(%rdx,%rcx,1)
add    $0xfffffffffffffff0,%r10
add    $0xfffffffe,%r9d
add    $0xfffffffffffffffe,%r8
jne    14b0 <set_bytes_u+0x3b0>
ret

LLVM IR (-O0):
define void @set_bytes_u(i64 %0, i32 %1, i8* %2) {
%4 = alloca i64
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i32
store i64 %0, i64* %4
store i32 %1, i32* %5
store i8* %2, i8** %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 i64, i64* %4
%14 = load i32, i32* %7
%15 = add nsw i32 %14, 1
%16 = sext i32 %15 to i64
%17 = sub i64 8, %16
%18 = mul i64 %17, 8
%19 = shl i64 %13, %18
%20 = lshr i64 %19, 56
%21 = trunc i64 %20 to i8
%22 = load i8*, i8** %6
%23 = load i32, i32* %5
%24 = sub nsw i32 %23, 1
%25 = load i32, i32* %7
%26 = sub nsw i32 %24, %25
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds i8, i8* %22, i64 %27
store i8 %21, 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 @set_bytes_u(i64 %0, i32 %1, i8* nocapture writeonly %2) {
%4 = icmp sgt i32 %1, 0
br i1 %4, label %5, label %88
5: ; preds = %3
%6 = zext i32 %1 to i64
%7 = icmp ult i32 %1, 16
br i1 %7, label %42, label %8
8: ; preds = %5
%9 = add nsw i64 %6, -1
%10 = add i32 %1, -1
%11 = trunc i64 %9 to i32
%12 = sub i32 %10, %11
%13 = icmp sgt i32 %12, %10
%14 = icmp ugt i64 %9, 4294967295
%15 = or i1 %13, %14
br i1 %15, label %42, label %16
16: ; preds = %8
%17 = and i64 %6, 4294967280
%18 = insertelement <16 x i64> poison, i64 %0, i64 0
%19 = shufflevector <16 x i64> %18, <16 x i64> poison, <16 x i32> zeroinitializer
%20 = getelementptr inbounds i8, i8* %2, i64 -15
br label %21
21: ; preds = %21, %16
%22 = phi i64 [ 0, %16 ], [ %37, %21 ]
%23 = phi <16 x i64> [ <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>, %16 ], [ %38, %21 ]
%24 = trunc i64 %22 to i32
%25 = xor <16 x i64> %23, <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1>
%26 = shl <16 x i64> %25, <i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3>
%27 = add nsw <16 x i64> %26, <i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64>
%28 = shl <16 x i64> %19, %27
%29 = lshr <16 x i64> %28, <i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56>
%30 = trunc <16 x i64> %29 to <16 x i8>
%31 = xor i32 %24, -1
%32 = add i32 %31, %1
%33 = sext i32 %32 to i64
%34 = shufflevector <16 x i8> %30, <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>
%35 = getelementptr inbounds i8, i8* %20, i64 %33
%36 = bitcast i8* %35 to <16 x i8>*
store <16 x i8> %34, <16 x i8>* %36
%37 = add nuw i64 %22, 16
%38 = add <16 x i64> %23, <i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16>
%39 = icmp eq i64 %37, %17
br i1 %39, label %40, label %21
40: ; preds = %21
%41 = icmp eq i64 %17, %6
br i1 %41, label %88, label %42
42: ; preds = %8, %5, %40
%43 = phi i64 [ 0, %8 ], [ 0, %5 ], [ %17, %40 ]
%44 = xor i64 %43, -1
%45 = and i64 %6, 1
%46 = icmp eq i64 %45, 0
br i1 %46, label %59, label %47
47: ; preds = %42
%48 = or i64 %43, 1
%49 = mul nsw i64 %48, -8
%50 = add nsw i64 %49, 64
%51 = shl i64 %0, %50
%52 = lshr i64 %51, 56
%53 = trunc i64 %52 to i8
%54 = trunc i64 %43 to i32
%55 = xor i32 %54, -1
%56 = add i32 %55, %1
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i8, i8* %2, i64 %57
store i8 %53, i8* %58
br label %59
59: ; preds = %47, %42
%60 = phi i64 [ %43, %42 ], [ %48, %47 ]
%61 = sub nsw i64 0, %6
%62 = icmp eq i64 %44, %61
br i1 %62, label %88, label %63
63: ; preds = %59, %63
%64 = phi i64 [ %76, %63 ], [ %60, %59 ]
%65 = add nuw nsw i64 %64, 1
%66 = mul nsw i64 %65, -8
%67 = add nsw i64 %66, 64
%68 = shl i64 %0, %67
%69 = lshr i64 %68, 56
%70 = trunc i64 %69 to i8
%71 = trunc i64 %64 to i32
%72 = xor i32 %71, -1
%73 = add i32 %72, %1
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds i8, i8* %2, i64 %74
store i8 %70, i8* %75
%76 = add nuw nsw i64 %64, 2
%77 = mul nsw i64 %76, -8
%78 = add nsw i64 %77, 64
%79 = shl i64 %0, %78
%80 = lshr i64 %79, 56
%81 = trunc i64 %80 to i8
%82 = trunc i64 %65 to i32
%83 = xor i32 %82, -1
%84 = add i32 %83, %1
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds i8, i8* %2, i64 %85
store i8 %81, i8* %86
%87 = icmp eq i64 %76, %6
br i1 %87, label %88, label %63
88: ; preds = %59, %63, %40, %3
ret void
}