void *__constant_c_memset(void *s, unsigned long c, long count) {
  unsigned long xs = (unsigned long)s;
  while (count > 0 && (xs & 7)) {
    *(char *)xs = c;
    count--;
    xs++;
  }
  while (count > 7) {
    *(unsigned long *)xs = c;
    count -= 8;
    xs += 8;
  }
  while (count > 0) {
    *(char *)xs = c;
    count--;
    xs++;
  }
  return s;
}


x86 assembly (clang, -O0):
<__constant_c_memset>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x18(%rbp)
mov    %al,-0x21(%rbp)
jle    113a <__constant_c_memset+0x3a>
mov    -0x20(%rbp),%rax
and    $0x7,%rax
cmp    $0x0,%rax
setne  %al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
test   $0x1,%al
jne    114a <__constant_c_memset+0x4a>
jmp    1173 <__constant_c_memset+0x73>
mov    -0x10(%rbp),%rax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1118 <__constant_c_memset+0x18>
jmp    1178 <__constant_c_memset+0x78>
cmpq   $0x7,-0x18(%rbp)
jle    11ab <__constant_c_memset+0xab>
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
sub    $0x8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
jmp    1178 <__constant_c_memset+0x78>
jmp    11b0 <__constant_c_memset+0xb0>
cmpq   $0x0,-0x18(%rbp)
jle    11e4 <__constant_c_memset+0xe4>
mov    -0x10(%rbp),%rax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    11b0 <__constant_c_memset+0xb0>
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<__constant_c_memset>:
mov    %rdi,%rax
test   %rdx,%rdx
jle    121b <__constant_c_memset+0x11b>
mov    %eax,%ecx
and    $0x7,%ecx
test   %rcx,%rcx
je     121b <__constant_c_memset+0x11b>
mov    %sil,(%rax)
lea    -0x1(%rdx),%rdi
lea    0x1(%rax),%r10
cmp    $0x2,%rdx
jb     1221 <__constant_c_memset+0x121>
mov    %r10d,%ecx
and    $0x7,%ecx
test   %rcx,%rcx
je     1221 <__constant_c_memset+0x121>
mov    %sil,0x1(%rax)
lea    -0x2(%rdx),%r8
lea    0x2(%rax),%r10
cmp    $0x2,%rdi
jb     124b <__constant_c_memset+0x14b>
mov    %r10d,%ecx
and    $0x7,%ecx
test   %rcx,%rcx
je     124b <__constant_c_memset+0x14b>
mov    %sil,0x2(%rax)
lea    -0x3(%rdx),%rdi
lea    0x3(%rax),%r10
cmp    $0x2,%r8
jb     1221 <__constant_c_memset+0x121>
mov    %r10d,%ecx
and    $0x7,%ecx
test   %rcx,%rcx
je     1221 <__constant_c_memset+0x121>
mov    %sil,0x3(%rax)
lea    -0x4(%rdx),%r8
lea    0x4(%rax),%r10
cmp    $0x2,%rdi
jb     124b <__constant_c_memset+0x14b>
mov    %r10d,%ecx
and    $0x7,%ecx
test   %rcx,%rcx
je     124b <__constant_c_memset+0x14b>
mov    %sil,0x4(%rax)
lea    -0x5(%rdx),%rdi
lea    0x5(%rax),%r10
cmp    $0x2,%r8
jb     1221 <__constant_c_memset+0x121>
mov    %r10d,%ecx
and    $0x7,%ecx
test   %rcx,%rcx
je     1221 <__constant_c_memset+0x121>
mov    %sil,0x5(%rax)
lea    -0x6(%rdx),%r8
lea    0x6(%rax),%r10
cmp    $0x2,%rdi
jb     124b <__constant_c_memset+0x14b>
mov    %r10d,%ecx
and    $0x7,%ecx
test   %rcx,%rcx
je     124b <__constant_c_memset+0x14b>
mov    %sil,0x6(%rax)
lea    -0x7(%rdx),%rdi
lea    0x7(%rax),%r10
cmp    $0x2,%r8
jb     1221 <__constant_c_memset+0x121>
mov    %r10d,%ecx
and    $0x7,%ecx
test   %rcx,%rcx
je     1221 <__constant_c_memset+0x121>
mov    %sil,0x7(%rax)
add    $0xfffffffffffffff8,%rdx
lea    0x8(%rax),%r10
mov    %rdx,%rdi
cmp    $0x8,%rdi
jl     1254 <__constant_c_memset+0x154>
jmp    1230 <__constant_c_memset+0x130>
mov    %rdx,%rdi
mov    %rax,%r10
cmp    $0x8,%rdi
jl     1254 <__constant_c_memset+0x154>
nopw   0x0(%rax,%rax,1)
mov    %rsi,(%r10)
lea    -0x8(%rdi),%rdx
add    $0x8,%r10
cmp    $0xf,%rdi
mov    %rdx,%rdi
ja     1230 <__constant_c_memset+0x130>
test   %rdx,%rdx
jg     125c <__constant_c_memset+0x15c>
jmp    12bd <__constant_c_memset+0x1bd>
mov    %r8,%rdi
cmp    $0x8,%rdi
jge    1230 <__constant_c_memset+0x130>
mov    %rdi,%rdx
test   %rdx,%rdx
jle    12bd <__constant_c_memset+0x1bd>
lea    -0x1(%rdx),%r8
mov    %rdx,%r9
and    $0x7,%r9
je     1283 <__constant_c_memset+0x183>
xor    %edi,%edi
nopl   0x0(%rax,%rax,1)
mov    %sil,(%r10,%rdi,1)
add    $0x1,%rdi
cmp    %rdi,%r9
jne    1270 <__constant_c_memset+0x170>
add    %rdi,%r10
sub    %rdi,%rdx
cmp    $0x7,%r8
jb     12bd <__constant_c_memset+0x1bd>
add    $0xffffffffffffffff,%rdx
nopl   (%rax)
mov    %sil,(%r10)
mov    %sil,0x1(%r10)
mov    %sil,0x2(%r10)
mov    %sil,0x3(%r10)
mov    %sil,0x4(%r10)
mov    %sil,0x5(%r10)
mov    %sil,0x6(%r10)
mov    %sil,0x7(%r10)
add    $0xfffffffffffffff8,%rdx
add    $0x8,%r10
cmp    $0xfffffffffffffffe,%rdx
jb     1290 <__constant_c_memset+0x190>
ret

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

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