set(param, val, type, defval, minval, maxval) int *param;
int val;
char type;
int defval;
int minval;
int maxval;
{
  switch (type) {
  case '\r':
  case '\n':
    *param = defval;
    break;
  case '+':
    *param += val;
    break;
  case '-':
    *param -= val;
    break;
  default:
    *param = val;
    break;
  }
  *param = min(*param, maxval);
  *param = max(*param, minval);
}


x86 assembly (clang, -O0):
<set>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %dl,%al
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %al,-0x15(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
movsbl -0x15(%rbp),%eax
add    $0xfffffff6,%eax
mov    %eax,%ecx
mov    %rcx,-0x30(%rbp)
sub    $0x23,%eax
ja     1199 <set+0x79>
mov    -0x30(%rbp),%rax
lea    0xea0(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x1c(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    11a2 <set+0x82>
mov    -0x14(%rbp),%ecx
mov    -0x10(%rbp),%rax
add    (%rax),%ecx
mov    %ecx,(%rax)
jmp    11a2 <set+0x82>
mov    -0x14(%rbp),%edx
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
sub    %edx,%ecx
mov    %ecx,(%rax)
jmp    11a2 <set+0x82>
mov    -0x14(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
mov    (%rax),%edi
mov    -0x24(%rbp),%esi
mov    $0x0,%al
call   1030 <min@plt>
mov    %eax,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
mov    (%rax),%edi
mov    -0x20(%rbp),%esi
mov    $0x0,%al
call   1040 <max@plt>
mov    %eax,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<set>:
push   %rbp
push   %rbx
push   %rax
mov    %r8d,%ebp
mov    %rdi,%rbx
movsbl %dl,%eax
add    $0xfffffff6,%eax
cmp    $0x23,%eax
ja     1146 <set+0x26>
lea    0xec5(%rip),%rdx
movslq (%rdx,%rax,4),%rax
add    %rdx,%rax
jmp    *%rax
add    (%rbx),%esi
mov    %esi,%ecx
jmp    114e <set+0x2e>
mov    (%rbx),%ecx
sub    %esi,%ecx
mov    %ecx,(%rbx)
mov    %ecx,%edi
mov    %r9d,%esi
xor    %eax,%eax
call   1030 <min@plt>
mov    %eax,(%rbx)
mov    %eax,%edi
mov    %ebp,%esi
xor    %eax,%eax
call   1040 <max@plt>
mov    %eax,(%rbx)
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define i32 @set(i32* %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5) {
%7 = alloca i32
%8 = alloca i32*
%9 = alloca i32
%10 = alloca i8
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = trunc i32 %2 to i8
store i32* %0, i32** %8
store i32 %1, i32* %9
store i8 %14, i8* %10
store i32 %3, i32* %11
store i32 %4, i32* %12
store i32 %5, i32* %13
%15 = load i8, i8* %10
%16 = sext i8 %15 to i32
switch i32 %16, label %30 [
i32 13, label %17
i32 10, label %17
i32 43, label %20
i32 45, label %25
]
17: ; preds = %6, %6
%18 = load i32, i32* %11
%19 = load i32*, i32** %8
store i32 %18, i32* %19
br label %33
20: ; preds = %6
%21 = load i32, i32* %9
%22 = load i32*, i32** %8
%23 = load i32, i32* %22
%24 = add nsw i32 %23, %21
store i32 %24, i32* %22
br label %33
25: ; preds = %6
%26 = load i32, i32* %9
%27 = load i32*, i32** %8
%28 = load i32, i32* %27
%29 = sub nsw i32 %28, %26
store i32 %29, i32* %27
br label %33
30: ; preds = %6
%31 = load i32, i32* %9
%32 = load i32*, i32** %8
store i32 %31, i32* %32
br label %33
33: ; preds = %30, %25, %20, %17
%34 = load i32*, i32** %8
%35 = load i32, i32* %34
%36 = load i32, i32* %13
%37 = call i32 (i32, i32, ...) bitcast (i32 (...)* @min to i32 (i32, i32, ...)*)(i32 %35, i32 %36)
%38 = load i32*, i32** %8
store i32 %37, i32* %38
%39 = load i32*, i32** %8
%40 = load i32, i32* %39
%41 = load i32, i32* %12
%42 = call i32 (i32, i32, ...) bitcast (i32 (...)* @max to i32 (i32, i32, ...)*)(i32 %40, i32 %41)
%43 = load i32*, i32** %8
store i32 %42, i32* %43
%44 = load i32, i32* %7
ret i32 %44
}

LLVM IR (-O2):
define i32 @set(i32* nocapture %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5) {
%7 = shl i32 %2, 24
%8 = ashr exact i32 %7, 24
switch i32 %8, label %15 [
i32 13, label %16
i32 10, label %16
i32 43, label %9
i32 45, label %12
]
9: ; preds = %6
%10 = load i32, i32* %0
%11 = add nsw i32 %10, %1
br label %16
12: ; preds = %6
%13 = load i32, i32* %0
%14 = sub nsw i32 %13, %1
br label %16
15: ; preds = %6
br label %16
16: ; preds = %6, %6, %15, %12, %9
%17 = phi i32 [ %1, %15 ], [ %14, %12 ], [ %11, %9 ], [ %3, %6 ], [ %3, %6 ]
store i32 %17, i32* %0
%18 = tail call i32 (i32, i32, ...) bitcast (i32 (...)* @min to i32 (i32, i32, ...)*)(i32 %17, i32 %5)
store i32 %18, i32* %0
%19 = tail call i32 (i32, i32, ...) bitcast (i32 (...)* @max to i32 (i32, i32, ...)*)(i32 %18, i32 %4)
store i32 %19, i32* %0
ret i32 undef
}