void get_fields(char **fields, int i, int *n, int *r, int *f, int *d) {
  *n = 0;
  *r = 0;
  *f = 0;
  *d = 0;
  int len = 0;
  while (fields[len])
    len++;
  if (i >= len)
    return;
  char *field_string = fields[i];
  while (*field_string) {
    switch (*field_string) {
    case 'n':
      *n = 1;
      break;
    case 'r':
      *r = 1;
      break;
    case 'f':
      *f = 1;
      break;
    case 'd':
      *d = 1;
      break;
    }
    field_string++;
  }
}


x86 assembly (clang, -O0):
<get_fields>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x28(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x0,-0x34(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
je     116b <get_fields+0x6b>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    114a <get_fields+0x4a>
mov    -0xc(%rbp),%eax
cmp    -0x34(%rbp),%eax
jl     117c <get_fields+0x7c>
jmp    120e <get_fields+0x10e>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmpb   $0x0,(%rax)
je     120e <get_fields+0x10e>
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
add    $0xffffff9c,%eax
mov    %eax,%ecx
mov    %rcx,-0x48(%rbp)
sub    $0xe,%eax
ja     11fd <get_fields+0xfd>
mov    -0x48(%rbp),%rax
lea    0xe43(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x18(%rbp),%rax
movl   $0x1,(%rax)
jmp    11fd <get_fields+0xfd>
mov    -0x20(%rbp),%rax
movl   $0x1,(%rax)
jmp    11fd <get_fields+0xfd>
mov    -0x28(%rbp),%rax
movl   $0x1,(%rax)
jmp    11fd <get_fields+0xfd>
mov    -0x30(%rbp),%rax
movl   $0x1,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    118c <get_fields+0x8c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_fields>:
movl   $0x0,(%rdx)
movl   $0x0,(%rcx)
movl   $0x0,(%r8)
movl   $0x0,(%r9)
mov    $0xffffffff,%eax
mov    %rdi,%r10
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%eax
cmpq   $0x0,(%r10)
lea    0x8(%r10),%r10
jne    1130 <get_fields+0x30>
cmp    %esi,%eax
jle    11a5 <get_fields+0xa5>
movslq %esi,%rax
mov    (%rdi,%rax,8),%rdi
mov    (%rdi),%al
test   %al,%al
je     11a5 <get_fields+0xa5>
add    $0x1,%rdi
lea    0xea7(%rip),%r10
jmp    1174 <get_fields+0x74>
nopl   0x0(%rax,%rax,1)
mov    %r9,%rax
movl   $0x1,(%rax)
movzbl (%rdi),%eax
add    $0x1,%rdi
test   %al,%al
je     11a5 <get_fields+0xa5>
movsbl %al,%eax
add    $0xffffff9c,%eax
ror    %eax
cmp    $0x7,%eax
ja     1169 <get_fields+0x69>
movslq (%r10,%rax,4),%rsi
add    %r10,%rsi
mov    %rdx,%rax
jmp    *%rsi
mov    %r8,%rax
jmp    1163 <get_fields+0x63>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %rcx,%rax
jmp    1163 <get_fields+0x63>
ret

LLVM IR (-O0):
define void @get_fields(i8** %0, i32 %1, i32* %2, i32* %3, i32* %4, i32* %5) {
%7 = alloca i8**
%8 = alloca i32
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i32*
%12 = alloca i32*
%13 = alloca i32
%14 = alloca i8*
store i8** %0, i8*** %7
store i32 %1, i32* %8
store i32* %2, i32** %9
store i32* %3, i32** %10
store i32* %4, i32** %11
store i32* %5, i32** %12
%15 = load i32*, i32** %9
store i32 0, i32* %15
%16 = load i32*, i32** %10
store i32 0, i32* %16
%17 = load i32*, i32** %11
store i32 0, i32* %17
%18 = load i32*, i32** %12
store i32 0, i32* %18
store i32 0, i32* %13
br label %19
19: ; preds = %26, %6
%20 = load i8**, i8*** %7
%21 = load i32, i32* %13
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds i8*, i8** %20, i64 %22
%24 = load i8*, i8** %23
%25 = icmp ne i8* %24, null
br i1 %25, label %26, label %29
26: ; preds = %19
%27 = load i32, i32* %13
%28 = add nsw i32 %27, 1
store i32 %28, i32* %13
br label %19
29: ; preds = %19
%30 = load i32, i32* %8
%31 = load i32, i32* %13
%32 = icmp sge i32 %30, %31
br i1 %32, label %33, label %34
33: ; preds = %29
br label %59
34: ; preds = %29
%35 = load i8**, i8*** %7
%36 = load i32, i32* %8
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i8*, i8** %35, i64 %37
%39 = load i8*, i8** %38
store i8* %39, i8** %14
br label %40
40: ; preds = %56, %34
%41 = load i8*, i8** %14
%42 = load i8, i8* %41
%43 = icmp ne i8 %42, 0
br i1 %43, label %44, label %59
44: ; preds = %40
%45 = load i8*, i8** %14
%46 = load i8, i8* %45
%47 = sext i8 %46 to i32
switch i32 %47, label %56 [
i32 110, label %48
i32 114, label %50
i32 102, label %52
i32 100, label %54
]
48: ; preds = %44
%49 = load i32*, i32** %9
store i32 1, i32* %49
br label %56
50: ; preds = %44
%51 = load i32*, i32** %10
store i32 1, i32* %51
br label %56
52: ; preds = %44
%53 = load i32*, i32** %11
store i32 1, i32* %53
br label %56
54: ; preds = %44
%55 = load i32*, i32** %12
store i32 1, i32* %55
br label %56
56: ; preds = %44, %54, %52, %50, %48
%57 = load i8*, i8** %14
%58 = getelementptr inbounds i8, i8* %57, i32 1
store i8* %58, i8** %14
br label %40
59: ; preds = %33, %40
ret void
}

LLVM IR (-O2):
define void @get_fields(i8** nocapture %0, i32 %1, i32* nocapture writeonly %2, i32* nocapture writeonly %3, i32* nocapture writeonly %4, i32* nocapture writeonly %5) {
store i32 0, i32* %2
store i32 0, i32* %3
store i32 0, i32* %4
store i32 0, i32* %5
br label %7
7: ; preds = %7, %6
%8 = phi i64 [ %12, %7 ], [ 0, %6 ]
%9 = getelementptr inbounds i8*, i8** %0, i64 %8
%10 = load i8*, i8** %9
%11 = icmp eq i8* %10, null
%12 = add nuw i64 %8, 1
br i1 %11, label %13, label %7
13: ; preds = %7
%14 = trunc i64 %8 to i32
%15 = icmp sgt i32 %14, %1
br i1 %15, label %16, label %37
16: ; preds = %13
%17 = sext i32 %1 to i64
%18 = getelementptr inbounds i8*, i8** %0, i64 %17
%19 = load i8*, i8** %18
%20 = load i8, i8* %19
%21 = icmp eq i8 %20, 0
br i1 %21, label %37, label %22
22: ; preds = %16, %33
%23 = phi i8 [ %35, %33 ], [ %20, %16 ]
%24 = phi i8* [ %34, %33 ], [ %19, %16 ]
%25 = sext i8 %23 to i32
%26 = add nsw i32 %25, -100
%27 = tail call i32 @llvm.fshl.i32(i32 %26, i32 %26, i32 31)
switch i32 %27, label %33 [
i32 5, label %31
i32 7, label %28
i32 1, label %29
i32 0, label %30
]
28: ; preds = %22
br label %31
29: ; preds = %22
br label %31
30: ; preds = %22
br label %31
31: ; preds = %22, %28, %29, %30
%32 = phi i32* [ %5, %30 ], [ %4, %29 ], [ %3, %28 ], [ %2, %22 ]
store i32 1, i32* %32
br label %33
33: ; preds = %31, %22
%34 = getelementptr inbounds i8, i8* %24, i64 1
%35 = load i8, i8* %34
%36 = icmp eq i8 %35, 0
br i1 %36, label %37, label %22
37: ; preds = %33, %16, %13
ret void
}