char *parseAttributes(char string[], unsigned char key,
                      unsigned char buffer[]) {
  int set_index = 0;
  if (buffer[key] & 0x01) {
    string[set_index] = 'R';
    set_index += 1;
  }
  if (buffer[key] & 0x02) {
    string[set_index] = 'H';
    set_index += 1;
  }
  if (buffer[key] & 0x04) {
    string[set_index] = 'S';
    set_index += 1;
  }
  if (buffer[key] & 0x20) {
    string[set_index] = 'A';
    set_index += 1;
  }
  string[set_index] = '\0';
  return string;
}


x86 assembly (clang, -O0):
<parseAttributes>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %rdi,-0x8(%rbp)
mov    %al,-0x9(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
movzbl -0x9(%rbp),%ecx
movzbl (%rax,%rcx,1),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1146 <parseAttributes+0x46>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x52,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
movzbl -0x9(%rbp),%ecx
movzbl (%rax,%rcx,1),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     1173 <parseAttributes+0x73>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x48,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
movzbl -0x9(%rbp),%ecx
movzbl (%rax,%rcx,1),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     11a0 <parseAttributes+0xa0>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x53,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
movzbl -0x9(%rbp),%ecx
movzbl (%rax,%rcx,1),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     11cd <parseAttributes+0xcd>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x41,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<parseAttributes>:
mov    %rdi,%rax
mov    %esi,%esi
mov    (%rdx,%rsi,1),%cl
xor    %edi,%edi
test   $0x1,%cl
jne    112e <parseAttributes+0x2e>
test   $0x2,%cl
jne    113e <parseAttributes+0x3e>
test   $0x4,%cl
jne    114f <parseAttributes+0x4f>
test   $0x20,%cl
je     1127 <parseAttributes+0x27>
mov    %edi,%ecx
movb   $0x41,(%rax,%rcx,1)
add    $0x1,%edi
mov    %edi,%ecx
movb   $0x0,(%rax,%rcx,1)
ret
movb   $0x52,(%rax)
mov    (%rdx,%rsi,1),%cl
mov    $0x1,%edi
test   $0x2,%cl
je     1114 <parseAttributes+0x14>
mov    %edi,%ecx
movb   $0x48,(%rax,%rcx,1)
add    $0x1,%edi
mov    (%rdx,%rsi,1),%cl
test   $0x4,%cl
je     1119 <parseAttributes+0x19>
mov    %edi,%ecx
movb   $0x53,(%rax,%rcx,1)
add    $0x1,%edi
mov    (%rdx,%rsi,1),%cl
test   $0x20,%cl
jne    111e <parseAttributes+0x1e>
jmp    1127 <parseAttributes+0x27>

LLVM IR (-O0):
define i8* @parseAttributes(i8* %0, i8 zeroext %1, i8* %2) {
%4 = alloca i8*
%5 = alloca i8
%6 = alloca i8*
%7 = alloca i32
store i8* %0, i8** %4
store i8 %1, i8* %5
store i8* %2, i8** %6
store i32 0, i32* %7
%8 = load i8*, i8** %6
%9 = load i8, i8* %5
%10 = zext i8 %9 to i64
%11 = getelementptr inbounds i8, i8* %8, i64 %10
%12 = load i8, i8* %11
%13 = zext i8 %12 to i32
%14 = and i32 %13, 1
%15 = icmp ne i32 %14, 0
br i1 %15, label %16, label %23
16: ; preds = %3
%17 = load i8*, i8** %4
%18 = load i32, i32* %7
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i8, i8* %17, i64 %19
store i8 82, i8* %20
%21 = load i32, i32* %7
%22 = add nsw i32 %21, 1
store i32 %22, i32* %7
br label %23
23: ; preds = %16, %3
%24 = load i8*, i8** %6
%25 = load i8, i8* %5
%26 = zext i8 %25 to i64
%27 = getelementptr inbounds i8, i8* %24, i64 %26
%28 = load i8, i8* %27
%29 = zext i8 %28 to i32
%30 = and i32 %29, 2
%31 = icmp ne i32 %30, 0
br i1 %31, label %32, label %39
32: ; preds = %23
%33 = load i8*, i8** %4
%34 = load i32, i32* %7
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds i8, i8* %33, i64 %35
store i8 72, i8* %36
%37 = load i32, i32* %7
%38 = add nsw i32 %37, 1
store i32 %38, i32* %7
br label %39
39: ; preds = %32, %23
%40 = load i8*, i8** %6
%41 = load i8, i8* %5
%42 = zext i8 %41 to i64
%43 = getelementptr inbounds i8, i8* %40, i64 %42
%44 = load i8, i8* %43
%45 = zext i8 %44 to i32
%46 = and i32 %45, 4
%47 = icmp ne i32 %46, 0
br i1 %47, label %48, label %55
48: ; preds = %39
%49 = load i8*, i8** %4
%50 = load i32, i32* %7
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i8, i8* %49, i64 %51
store i8 83, i8* %52
%53 = load i32, i32* %7
%54 = add nsw i32 %53, 1
store i32 %54, i32* %7
br label %55
55: ; preds = %48, %39
%56 = load i8*, i8** %6
%57 = load i8, i8* %5
%58 = zext i8 %57 to i64
%59 = getelementptr inbounds i8, i8* %56, i64 %58
%60 = load i8, i8* %59
%61 = zext i8 %60 to i32
%62 = and i32 %61, 32
%63 = icmp ne i32 %62, 0
br i1 %63, label %64, label %71
64: ; preds = %55
%65 = load i8*, i8** %4
%66 = load i32, i32* %7
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i8, i8* %65, i64 %67
store i8 65, i8* %68
%69 = load i32, i32* %7
%70 = add nsw i32 %69, 1
store i32 %70, i32* %7
br label %71
71: ; preds = %64, %55
%72 = load i8*, i8** %4
%73 = load i32, i32* %7
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds i8, i8* %72, i64 %74
store i8 0, i8* %75
%76 = load i8*, i8** %4
ret i8* %76
}

LLVM IR (-O2):
define i8* @parseAttributes(i8* returned writeonly %0, i8 zeroext %1, i8* nocapture %2) {
%4 = zext i8 %1 to i64
%5 = getelementptr inbounds i8, i8* %2, i64 %4
%6 = load i8, i8* %5
%7 = and i8 %6, 1
%8 = icmp eq i8 %7, 0
br i1 %8, label %11, label %9
9: ; preds = %3
store i8 82, i8* %0
%10 = load i8, i8* %5
br label %11
11: ; preds = %9, %3
%12 = phi i8 [ %10, %9 ], [ %6, %3 ]
%13 = phi i32 [ 1, %9 ], [ 0, %3 ]
%14 = and i8 %12, 2
%15 = icmp eq i8 %14, 0
br i1 %15, label %21, label %16
16: ; preds = %11
%17 = zext i32 %13 to i64
%18 = getelementptr inbounds i8, i8* %0, i64 %17
store i8 72, i8* %18
%19 = add nuw nsw i32 %13, 1
%20 = load i8, i8* %5
br label %21
21: ; preds = %16, %11
%22 = phi i8 [ %20, %16 ], [ %12, %11 ]
%23 = phi i32 [ %19, %16 ], [ %13, %11 ]
%24 = and i8 %22, 4
%25 = icmp eq i8 %24, 0
br i1 %25, label %31, label %26
26: ; preds = %21
%27 = zext i32 %23 to i64
%28 = getelementptr inbounds i8, i8* %0, i64 %27
store i8 83, i8* %28
%29 = add nuw nsw i32 %23, 1
%30 = load i8, i8* %5
br label %31
31: ; preds = %26, %21
%32 = phi i8 [ %30, %26 ], [ %22, %21 ]
%33 = phi i32 [ %29, %26 ], [ %23, %21 ]
%34 = and i8 %32, 32
%35 = icmp eq i8 %34, 0
br i1 %35, label %40, label %36
36: ; preds = %31
%37 = zext i32 %33 to i64
%38 = getelementptr inbounds i8, i8* %0, i64 %37
store i8 65, i8* %38
%39 = add nuw nsw i32 %33, 1
br label %40
40: ; preds = %36, %31
%41 = phi i32 [ %39, %36 ], [ %33, %31 ]
%42 = zext i32 %41 to i64
%43 = getelementptr inbounds i8, i8* %0, i64 %42
store i8 0, i8* %43
ret i8* %0
}