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


x86 assembly (clang, -O0):
<s_memset2o>:
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    %ax,-0x22(%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     1171 <s_memset2o+0x71>
mov    -0x8(%rbp),%rax
movzbl (%rax),%eax
cmp    -0xc(%rbp),%eax
jne    1154 <s_memset2o+0x54>
mov    -0x22(%rbp),%cx
mov    -0x30(%rbp),%rax
mov    %cx,(%rax)
mov    -0x30(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1125 <s_memset2o+0x25>
pop    %rbp
ret

x86 assembly (clang, -O2):
<s_memset2o>:
push   %rbp
push   %rbx
test   %r8d,%r8d
je     12c5 <s_memset2o+0x1c5>
lea    -0x1(%r8),%r10d
cmp    $0x7,%r10d
jb     1137 <s_memset2o+0x37>
lea    (%r10,%rdi,1),%rax
add    $0x1,%rax
cmp    %rdx,%rax
jbe    11d8 <s_memset2o+0xd8>
lea    (%rdx,%r10,2),%rax
add    $0x2,%rax
cmp    %rdi,%rax
jbe    11d8 <s_memset2o+0xd8>
mov    %rdx,%rax
mov    %rdi,%r9
lea    -0x1(%r8),%edx
test   $0x3,%r8b
je     1180 <s_memset2o+0x80>
mov    %r8d,%ebx
and    $0x3,%ebx
xor    %edi,%edi
jmp    116c <s_memset2o+0x6c>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x2,%rax
add    $0x1,%rdi
cmp    %edi,%ebx
je     117a <s_memset2o+0x7a>
movzbl (%r9,%rdi,1),%ebp
cmp    %esi,%ebp
jne    1160 <s_memset2o+0x60>
mov    %cx,(%rax)
jmp    1160 <s_memset2o+0x60>
sub    %edi,%r8d
add    %rdi,%r9
cmp    $0x3,%edx
jb     12c5 <s_memset2o+0x1c5>
mov    %r8d,%edx
xor    %edi,%edi
jmp    119c <s_memset2o+0x9c>
add    $0x4,%rdi
cmp    %edi,%edx
je     12c5 <s_memset2o+0x1c5>
movzbl (%r9,%rdi,1),%ebp
cmp    %esi,%ebp
jne    11a9 <s_memset2o+0xa9>
mov    %cx,(%rax,%rdi,2)
movzbl 0x1(%r9,%rdi,1),%ebp
cmp    %esi,%ebp
jne    11b8 <s_memset2o+0xb8>
mov    %cx,0x2(%rax,%rdi,2)
movzbl 0x2(%r9,%rdi,1),%ebp
cmp    %esi,%ebp
jne    11c7 <s_memset2o+0xc7>
mov    %cx,0x4(%rax,%rdi,2)
movzbl 0x3(%r9,%rdi,1),%ebp
cmp    %esi,%ebp
jne    1190 <s_memset2o+0x90>
mov    %cx,0x6(%rax,%rdi,2)
jmp    1190 <s_memset2o+0x90>
add    $0x1,%r10
mov    %r10,%r11
and    $0xfffffffffffffff8,%r11
sub    %r11d,%r8d
lea    (%rdx,%r11,2),%rax
lea    (%rdi,%r11,1),%r9
movd   %esi,%xmm0
pshufd $0x0,%xmm0,%xmm0
xor    %ebx,%ebx
pxor   %xmm1,%xmm1
jmp    120d <s_memset2o+0x10d>
nop
add    $0x8,%rbx
cmp    %rbx,%r11
je     12bc <s_memset2o+0x1bc>
movq   (%rdi,%rbx,1),%xmm2
punpcklbw %xmm1,%xmm2
movdqa %xmm2,%xmm3
punpcklwd %xmm1,%xmm3
pcmpeqd %xmm0,%xmm3
movd   %xmm3,%ebp
test   $0x1,%bpl
je     1230 <s_memset2o+0x130>
mov    %cx,(%rdx,%rbx,2)
movdqa %xmm3,%xmm4
psrlq  $0x10,%xmm4
movd   %xmm4,%ebp
shr    $0x10,%ebp
test   $0x1,%bpl
je     124b <s_memset2o+0x14b>
mov    %cx,0x2(%rdx,%rbx,2)
pextrw $0x4,%xmm3,%ebp
test   $0x1,%bpl
je     125b <s_memset2o+0x15b>
mov    %cx,0x4(%rdx,%rbx,2)
pextrw $0x6,%xmm3,%ebp
test   $0x1,%bpl
je     126b <s_memset2o+0x16b>
mov    %cx,0x6(%rdx,%rbx,2)
punpckhwd %xmm1,%xmm2
pcmpeqd %xmm0,%xmm2
pextrw $0x0,%xmm2,%ebp
test   $0x1,%bpl
je     1283 <s_memset2o+0x183>
mov    %cx,0x8(%rdx,%rbx,2)
pextrw $0x2,%xmm2,%ebp
test   $0x1,%bpl
je     1293 <s_memset2o+0x193>
mov    %cx,0xa(%rdx,%rbx,2)
pextrw $0x4,%xmm2,%ebp
test   $0x1,%bpl
je     12a3 <s_memset2o+0x1a3>
mov    %cx,0xc(%rdx,%rbx,2)
pextrw $0x7,%xmm2,%ebp
test   $0x1,%bpl
je     1200 <s_memset2o+0x100>
mov    %cx,0xe(%rdx,%rbx,2)
jmp    1200 <s_memset2o+0x100>
cmp    %r11,%r10
jne    113d <s_memset2o+0x3d>
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define void @s_memset2o(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 i16
%12 = alloca i16*
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 i16
store i16 %14, i16* %11
%15 = load i8*, i8** %8
%16 = bitcast i8* %15 to i16*
store i16* %16, i16** %12
br label %17
17: ; preds = %30, %5
%18 = load i32, i32* %10
%19 = add nsw i32 %18, -1
store i32 %19, i32* %10
%20 = icmp ne i32 %18, 0
br i1 %20, label %21, label %35
21: ; preds = %17
%22 = load i8*, i8** %6
%23 = load i8, i8* %22
%24 = zext i8 %23 to i32
%25 = load i32, i32* %7
%26 = icmp eq i32 %24, %25
br i1 %26, label %27, label %30
27: ; preds = %21
%28 = load i16, i16* %11
%29 = load i16*, i16** %12
store i16 %28, i16* %29
br label %30
30: ; preds = %27, %21
%31 = load i16*, i16** %12
%32 = getelementptr inbounds i16, i16* %31, i32 1
store i16* %32, i16** %12
%33 = load i8*, i8** %6
%34 = getelementptr inbounds i8, i8* %33, i32 1
store i8* %34, i8** %6
br label %17
35: ; preds = %17
ret void
}

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