void s_memset1o(unsigned char *m, int id, void *dest, int c, int n) {
  unsigned char dc = (unsigned char)c;
  unsigned char *d = (unsigned char *)dest;
  while (n--) {
    if (*m == id) {
      *d = dc;
    }
    d++;
    m++;
  };
}


x86 assembly (clang, -O0):
<s_memset1o>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
mov    %al,-0x21(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
je     116e <s_memset1o+0x6e>
mov    -0x8(%rbp),%rax
movzbl (%rax),%eax
cmp    -0xc(%rbp),%eax
jne    1151 <s_memset1o+0x51>
mov    -0x21(%rbp),%cl
mov    -0x30(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1124 <s_memset1o+0x24>
pop    %rbp
ret

x86 assembly (clang, -O2):
<s_memset1o>:
push   %rbp
push   %rbx
test   %r8d,%r8d
je     12bd <s_memset1o+0x1bd>
lea    -0x1(%r8),%r10d
cmp    $0x7,%r10d
jb     1137 <s_memset1o+0x37>
lea    (%rdi,%r10,1),%rax
add    $0x1,%rax
cmp    %rdx,%rax
jbe    11d4 <s_memset1o+0xd4>
lea    (%rdx,%r10,1),%rax
add    $0x1,%rax
cmp    %rdi,%rax
jbe    11d4 <s_memset1o+0xd4>
mov    %rdx,%r9
mov    %rdi,%rax
lea    -0x1(%r8),%edx
test   $0x3,%r8b
je     117f <s_memset1o+0x7f>
mov    %r8d,%ebx
and    $0x3,%ebx
xor    %edi,%edi
jmp    1168 <s_memset1o+0x68>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%rdi
cmp    %edi,%ebx
je     1176 <s_memset1o+0x76>
movzbl (%rax,%rdi,1),%ebp
cmp    %esi,%ebp
jne    1160 <s_memset1o+0x60>
mov    %cl,(%r9,%rdi,1)
jmp    1160 <s_memset1o+0x60>
sub    %edi,%r8d
add    %rdi,%r9
add    %rdi,%rax
cmp    $0x3,%edx
jb     12bd <s_memset1o+0x1bd>
mov    %r8d,%edx
xor    %edi,%edi
jmp    119c <s_memset1o+0x9c>
nop
add    $0x4,%rdi
cmp    %edi,%edx
je     12bd <s_memset1o+0x1bd>
movzbl (%rax,%rdi,1),%ebp
cmp    %esi,%ebp
jne    11a8 <s_memset1o+0xa8>
mov    %cl,(%r9,%rdi,1)
movzbl 0x1(%rax,%rdi,1),%ebp
cmp    %esi,%ebp
jne    11b6 <s_memset1o+0xb6>
mov    %cl,0x1(%r9,%rdi,1)
movzbl 0x2(%rax,%rdi,1),%ebp
cmp    %esi,%ebp
jne    11c4 <s_memset1o+0xc4>
mov    %cl,0x2(%r9,%rdi,1)
movzbl 0x3(%rax,%rdi,1),%ebp
cmp    %esi,%ebp
jne    1190 <s_memset1o+0x90>
mov    %cl,0x3(%r9,%rdi,1)
jmp    1190 <s_memset1o+0x90>
add    $0x1,%r10
mov    %r10,%r11
and    $0xfffffffffffffff8,%r11
sub    %r11d,%r8d
lea    (%rdx,%r11,1),%r9
lea    (%rdi,%r11,1),%rax
movd   %esi,%xmm0
pshufd $0x0,%xmm0,%xmm0
xor    %ebx,%ebx
pxor   %xmm1,%xmm1
jmp    120d <s_memset1o+0x10d>
nopl   0x0(%rax,%rax,1)
add    $0x8,%rbx
cmp    %rbx,%r11
je     12b4 <s_memset1o+0x1b4>
movq   (%rdi,%rbx,1),%xmm2
punpcklbw %xmm1,%xmm2
movdqa %xmm2,%xmm3
punpcklwd %xmm1,%xmm3
pcmpeqd %xmm0,%xmm3
movd   %xmm3,%ebp
test   $0x1,%bpl
je     122f <s_memset1o+0x12f>
mov    %cl,(%rdx,%rbx,1)
movdqa %xmm3,%xmm4
psrlq  $0x10,%xmm4
movd   %xmm4,%ebp
shr    $0x10,%ebp
test   $0x1,%bpl
je     1249 <s_memset1o+0x149>
mov    %cl,0x1(%rdx,%rbx,1)
pextrw $0x4,%xmm3,%ebp
test   $0x1,%bpl
je     1258 <s_memset1o+0x158>
mov    %cl,0x2(%rdx,%rbx,1)
pextrw $0x6,%xmm3,%ebp
test   $0x1,%bpl
je     1267 <s_memset1o+0x167>
mov    %cl,0x3(%rdx,%rbx,1)
punpckhwd %xmm1,%xmm2
pcmpeqd %xmm0,%xmm2
pextrw $0x0,%xmm2,%ebp
test   $0x1,%bpl
je     127e <s_memset1o+0x17e>
mov    %cl,0x4(%rdx,%rbx,1)
pextrw $0x2,%xmm2,%ebp
test   $0x1,%bpl
je     128d <s_memset1o+0x18d>
mov    %cl,0x5(%rdx,%rbx,1)
pextrw $0x4,%xmm2,%ebp
test   $0x1,%bpl
je     129c <s_memset1o+0x19c>
mov    %cl,0x6(%rdx,%rbx,1)
pextrw $0x7,%xmm2,%ebp
test   $0x1,%bpl
je     1200 <s_memset1o+0x100>
mov    %cl,0x7(%rdx,%rbx,1)
jmp    1200 <s_memset1o+0x100>
cmp    %r11,%r10
jne    113d <s_memset1o+0x3d>
pop    %rbx
pop    %rbp
ret

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

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