char *single_param(char *st) {
  int quot1 = 0, quot2 = 0, start = 0;
  char *t = st;
  static int idx;
  idx = 0;
  while (1) {
    if (start == 1) {
      if (st[idx] == '\0')
        return t;
      if (st[idx] == '<' || st[idx] == '>') {
        st[idx] = '\0';
        return t;
      }
      if (st[idx] == ' ' && quot1 == 0 && quot2 == 0) {
        st[idx] = '\0';
        return t;
      }
      if (st[idx] == '\'' && quot1 == 1) {
        st[idx] = '\0';
        return t;
      }
      if (st[idx] == '"' && quot2 == 1) {
        st[idx] = '\0';
        return t;
      }
    } else {
      if (st[idx] == ' ' || st[idx] == '\0')
        ;
      else if (st[idx] == '"') {
        quot2 = 1;
        start = 1;
        t = &(st[idx + 1]);
      } else if (st[idx] == '\'') {
        quot1 = 1;
        start = 1;
        t = &(st[idx + 1]);
      } else {
        start = 1;
        t = &(st[idx]);
      }
    }
    idx++;
  }
}


x86 assembly (clang, -O0):
<single_param>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,0x2ef5(%rip)
cmpl   $0x1,-0x1c(%rbp)
jne    1273 <single_param+0x173>
mov    -0x10(%rbp),%rax
movslq 0x2ee0(%rip),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    115e <single_param+0x5e>
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1368 <single_param+0x268>
mov    -0x10(%rbp),%rax
movslq 0x2ebb(%rip),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3c,%eax
je     118e <single_param+0x8e>
mov    -0x10(%rbp),%rax
movslq 0x2ea3(%rip),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3e,%eax
jne    11aa <single_param+0xaa>
mov    -0x10(%rbp),%rax
movslq 0x2e8b(%rip),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1368 <single_param+0x268>
mov    -0x10(%rbp),%rax
movslq 0x2e6f(%rip),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jne    11f2 <single_param+0xf2>
cmpl   $0x0,-0x14(%rbp)
jne    11f2 <single_param+0xf2>
cmpl   $0x0,-0x18(%rbp)
jne    11f2 <single_param+0xf2>
mov    -0x10(%rbp),%rax
movslq 0x2e43(%rip),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1368 <single_param+0x268>
mov    -0x10(%rbp),%rax
movslq 0x2e27(%rip),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x27,%eax
jne    1230 <single_param+0x130>
cmpl   $0x1,-0x14(%rbp)
jne    1230 <single_param+0x130>
mov    -0x10(%rbp),%rax
movslq 0x2e05(%rip),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1368 <single_param+0x268>
mov    -0x10(%rbp),%rax
movslq 0x2de9(%rip),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x22,%eax
jne    126e <single_param+0x16e>
cmpl   $0x1,-0x18(%rbp)
jne    126e <single_param+0x16e>
mov    -0x10(%rbp),%rax
movslq 0x2dc7(%rip),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1368 <single_param+0x268>
jmp    1354 <single_param+0x254>
mov    -0x10(%rbp),%rax
movslq 0x2da6(%rip),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
je     12a3 <single_param+0x1a3>
mov    -0x10(%rbp),%rax
movslq 0x2d8e(%rip),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    12a8 <single_param+0x1a8>
jmp    134f <single_param+0x24f>
mov    -0x10(%rbp),%rax
movslq 0x2d71(%rip),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x22,%eax
jne    12ea <single_param+0x1ea>
movl   $0x1,-0x18(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    0x2d4c(%rip),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    134a <single_param+0x24a>
mov    -0x10(%rbp),%rax
movslq 0x2d2f(%rip),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x27,%eax
jne    132c <single_param+0x22c>
movl   $0x1,-0x14(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    0x2d0a(%rip),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    1345 <single_param+0x245>
movl   $0x1,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq 0x2ce6(%rip),%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    134a <single_param+0x24a>
jmp    134f <single_param+0x24f>
jmp    1354 <single_param+0x254>
mov    0x2cca(%rip),%eax
add    $0x1,%eax
mov    %eax,0x2cc1(%rip)
jmp    112f <single_param+0x2f>
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<single_param>:
xor    %esi,%esi
lea    0xef7(%rip),%r8
xor    %r10d,%r10d
xor    %r9d,%r9d
xor    %edx,%edx
mov    %rdi,%rax
jmp    1123 <single_param+0x23>
lea    (%rdi,%rsi,1),%rax
mov    $0x1,%edx
add    $0x1,%rsi
movzbl (%rdi,%rsi,1),%ecx
cmp    $0x1,%edx
jne    1170 <single_param+0x70>
test   %cl,%cl
je     11ac <single_param+0xac>
cmp    $0x3c,%cl
je     11a6 <single_param+0xa6>
cmp    $0x3e,%cl
je     11a6 <single_param+0xa6>
cmp    $0x20,%cl
jne    1149 <single_param+0x49>
test   %r10d,%r10d
jne    1149 <single_param+0x49>
test   %r9d,%r9d
je     11a6 <single_param+0xa6>
cmp    $0x27,%cl
jne    1154 <single_param+0x54>
cmp    $0x1,%r10d
je     11a6 <single_param+0xa6>
mov    $0x1,%edx
cmp    $0x22,%cl
jne    111f <single_param+0x1f>
cmp    $0x1,%r9d
jne    111f <single_param+0x1f>
jmp    11a6 <single_param+0xa6>
cs nopw 0x0(%rax,%rax,1)
cmp    $0x27,%cl
ja     1116 <single_param+0x16>
xor    %edx,%edx
movzbl %cl,%ecx
movslq (%r8,%rcx,4),%rcx
add    %r8,%rcx
jmp    *%rcx
lea    (%rsi,%rdi,1),%rax
add    $0x1,%rax
mov    $0x1,%r9d
jmp    111a <single_param+0x1a>
lea    (%rsi,%rdi,1),%rax
add    $0x1,%rax
mov    $0x1,%r10d
jmp    111a <single_param+0x1a>
mov    %esi,%ecx
movb   $0x0,(%rdi,%rcx,1)
ret

LLVM IR (-O0):
@single_param.idx = internal global i32 0
define i8* @single_param(i8* %0) {
%2 = alloca i8*
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i8*
store i8* %0, i8** %3
store i32 0, i32* %4
store i32 0, i32* %5
store i32 0, i32* %6
%8 = load i8*, i8** %3
store i8* %8, i8** %7
store i32 0, i32* @single_param.idx
br label %9
9: ; preds = %1, %152
%10 = load i32, i32* %6
%11 = icmp eq i32 %10, 1
br i1 %11, label %12, label %99
12: ; preds = %9
%13 = load i8*, i8** %3
%14 = load i32, i32* @single_param.idx
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds i8, i8* %13, i64 %15
%17 = load i8, i8* %16
%18 = sext i8 %17 to i32
%19 = icmp eq i32 %18, 0
br i1 %19, label %20, label %22
20: ; preds = %12
%21 = load i8*, i8** %7
store i8* %21, i8** %2
br label %155
22: ; preds = %12
%23 = load i8*, i8** %3
%24 = load i32, i32* @single_param.idx
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i8, i8* %23, i64 %25
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
%29 = icmp eq i32 %28, 60
br i1 %29, label %38, label %30
30: ; preds = %22
%31 = load i8*, i8** %3
%32 = load i32, i32* @single_param.idx
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i8, i8* %31, i64 %33
%35 = load i8, i8* %34
%36 = sext i8 %35 to i32
%37 = icmp eq i32 %36, 62
br i1 %37, label %38, label %44
38: ; preds = %30, %22
%39 = load i8*, i8** %3
%40 = load i32, i32* @single_param.idx
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i8, i8* %39, i64 %41
store i8 0, i8* %42
%43 = load i8*, i8** %7
store i8* %43, i8** %2
br label %155
44: ; preds = %30
%45 = load i8*, i8** %3
%46 = load i32, i32* @single_param.idx
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i8, i8* %45, i64 %47
%49 = load i8, i8* %48
%50 = sext i8 %49 to i32
%51 = icmp eq i32 %50, 32
br i1 %51, label %52, label %64
52: ; preds = %44
%53 = load i32, i32* %4
%54 = icmp eq i32 %53, 0
br i1 %54, label %55, label %64
55: ; preds = %52
%56 = load i32, i32* %5
%57 = icmp eq i32 %56, 0
br i1 %57, label %58, label %64
58: ; preds = %55
%59 = load i8*, i8** %3
%60 = load i32, i32* @single_param.idx
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds i8, i8* %59, i64 %61
store i8 0, i8* %62
%63 = load i8*, i8** %7
store i8* %63, i8** %2
br label %155
64: ; preds = %55, %52, %44
%65 = load i8*, i8** %3
%66 = load i32, i32* @single_param.idx
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i8, i8* %65, i64 %67
%69 = load i8, i8* %68
%70 = sext i8 %69 to i32
%71 = icmp eq i32 %70, 39
br i1 %71, label %72, label %81
72: ; preds = %64
%73 = load i32, i32* %4
%74 = icmp eq i32 %73, 1
br i1 %74, label %75, label %81
75: ; preds = %72
%76 = load i8*, i8** %3
%77 = load i32, i32* @single_param.idx
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds i8, i8* %76, i64 %78
store i8 0, i8* %79
%80 = load i8*, i8** %7
store i8* %80, i8** %2
br label %155
81: ; preds = %72, %64
%82 = load i8*, i8** %3
%83 = load i32, i32* @single_param.idx
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds i8, i8* %82, i64 %84
%86 = load i8, i8* %85
%87 = sext i8 %86 to i32
%88 = icmp eq i32 %87, 34
br i1 %88, label %89, label %98
89: ; preds = %81
%90 = load i32, i32* %5
%91 = icmp eq i32 %90, 1
br i1 %91, label %92, label %98
92: ; preds = %89
%93 = load i8*, i8** %3
%94 = load i32, i32* @single_param.idx
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds i8, i8* %93, i64 %95
store i8 0, i8* %96
%97 = load i8*, i8** %7
store i8* %97, i8** %2
br label %155
98: ; preds = %89, %81
br label %152
99: ; preds = %9
%100 = load i8*, i8** %3
%101 = load i32, i32* @single_param.idx
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds i8, i8* %100, i64 %102
%104 = load i8, i8* %103
%105 = sext i8 %104 to i32
%106 = icmp eq i32 %105, 32
br i1 %106, label %115, label %107
107: ; preds = %99
%108 = load i8*, i8** %3
%109 = load i32, i32* @single_param.idx
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds i8, i8* %108, i64 %110
%112 = load i8, i8* %111
%113 = sext i8 %112 to i32
%114 = icmp eq i32 %113, 0
br i1 %114, label %115, label %116
115: ; preds = %107, %99
br label %151
116: ; preds = %107
%117 = load i8*, i8** %3
%118 = load i32, i32* @single_param.idx
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds i8, i8* %117, i64 %119
%121 = load i8, i8* %120
%122 = sext i8 %121 to i32
%123 = icmp eq i32 %122, 34
br i1 %123, label %124, label %130
124: ; preds = %116
store i32 1, i32* %5
store i32 1, i32* %6
%125 = load i8*, i8** %3
%126 = load i32, i32* @single_param.idx
%127 = add nsw i32 %126, 1
%128 = sext i32 %127 to i64
%129 = getelementptr inbounds i8, i8* %125, i64 %128
store i8* %129, i8** %7
br label %150
130: ; preds = %116
%131 = load i8*, i8** %3
%132 = load i32, i32* @single_param.idx
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds i8, i8* %131, i64 %133
%135 = load i8, i8* %134
%136 = sext i8 %135 to i32
%137 = icmp eq i32 %136, 39
br i1 %137, label %138, label %144
138: ; preds = %130
store i32 1, i32* %4
store i32 1, i32* %6
%139 = load i8*, i8** %3
%140 = load i32, i32* @single_param.idx
%141 = add nsw i32 %140, 1
%142 = sext i32 %141 to i64
%143 = getelementptr inbounds i8, i8* %139, i64 %142
store i8* %143, i8** %7
br label %149
144: ; preds = %130
store i32 1, i32* %6
%145 = load i8*, i8** %3
%146 = load i32, i32* @single_param.idx
%147 = sext i32 %146 to i64
%148 = getelementptr inbounds i8, i8* %145, i64 %147
store i8* %148, i8** %7
br label %149
149: ; preds = %144, %138
br label %150
150: ; preds = %149, %124
br label %151
151: ; preds = %150, %115
br label %152
152: ; preds = %151, %98
%153 = load i32, i32* @single_param.idx
%154 = add nsw i32 %153, 1
store i32 %154, i32* @single_param.idx
br label %9
155: ; preds = %92, %75, %58, %38, %20
%156 = load i8*, i8** %2
ret i8* %156
}

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