void backLightRamp(unsigned char *red, unsigned char *green,
                   unsigned char *blue, unsigned char redStep,
                   unsigned char greenStep, unsigned char blueStep) {
  static unsigned int redInc = 1, greenInc = 1, blueInc = 1;
  if (redInc == 1 && *red < (0xff - redStep))
    *red += redStep;
  else if (*red > redStep) {
    redInc = 0;
    *red -= redStep;
  } else
    redInc = 1;
  if (greenInc == 1 && *green < (0xff - greenStep))
    *green += greenStep;
  else if (*green > greenStep) {
    greenInc = 0;
    *green -= greenStep;
  } else
    greenInc = 1;
  if (blueInc == 1 && *blue < (0xff - blueStep))
    *blue += blueStep;
  else if (*blue > blueStep) {
    blueInc = 0;
    *blue -= blueStep;
  } else
    blueInc = 1;
}


x86 assembly (clang, -O0):
<backLightRamp>:
push   %rbp
mov    %rsp,%rbp
mov    %r8d,-0x38(%rbp)
mov    %ecx,%eax
mov    -0x38(%rbp),%ecx
mov    %eax,-0x34(%rbp)
mov    %rdx,%rax
mov    -0x34(%rbp),%edx
mov    %rax,-0x30(%rbp)
mov    %rsi,%rax
mov    -0x30(%rbp),%rsi
mov    %rax,-0x28(%rbp)
mov    %rdi,%r8
mov    -0x28(%rbp),%rdi
mov    %r9b,%al
mov    %r8,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %dl,-0x19(%rbp)
mov    %cl,-0x1a(%rbp)
mov    %al,-0x1b(%rbp)
cmpl   $0x1,0x2ed5(%rip)
jne    117f <backLightRamp+0x7f>
mov    -0x8(%rbp),%rax
movzbl (%rax),%eax
movzbl -0x19(%rbp),%edx
mov    $0xff,%ecx
sub    %edx,%ecx
cmp    %ecx,%eax
jge    117f <backLightRamp+0x7f>
movzbl -0x19(%rbp),%edx
mov    -0x8(%rbp),%rax
movzbl (%rax),%ecx
add    %edx,%ecx
mov    %cl,(%rax)
jmp    11bf <backLightRamp+0xbf>
mov    -0x8(%rbp),%rax
movzbl (%rax),%eax
movzbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jle    11b0 <backLightRamp+0xb0>
movl   $0x0,0x2e84(%rip)
movzbl -0x19(%rbp),%edx
mov    -0x8(%rbp),%rax
movzbl (%rax),%ecx
sub    %edx,%ecx
mov    %cl,(%rax)
jmp    11ba <backLightRamp+0xba>
movl   $0x1,0x2e66(%rip)
jmp    11bf <backLightRamp+0xbf>
cmpl   $0x1,0x2e5e(%rip)
jne    11fa <backLightRamp+0xfa>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
movzbl -0x1a(%rbp),%edx
mov    $0xff,%ecx
sub    %edx,%ecx
cmp    %ecx,%eax
jge    11fa <backLightRamp+0xfa>
movzbl -0x1a(%rbp),%edx
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
add    %edx,%ecx
mov    %cl,(%rax)
jmp    123a <backLightRamp+0x13a>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
movzbl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
jle    122b <backLightRamp+0x12b>
movl   $0x0,0x2e0d(%rip)
movzbl -0x1a(%rbp),%edx
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
sub    %edx,%ecx
mov    %cl,(%rax)
jmp    1235 <backLightRamp+0x135>
movl   $0x1,0x2def(%rip)
jmp    123a <backLightRamp+0x13a>
cmpl   $0x1,0x2de7(%rip)
jne    1275 <backLightRamp+0x175>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
movzbl -0x1b(%rbp),%edx
mov    $0xff,%ecx
sub    %edx,%ecx
cmp    %ecx,%eax
jge    1275 <backLightRamp+0x175>
movzbl -0x1b(%rbp),%edx
mov    -0x18(%rbp),%rax
movzbl (%rax),%ecx
add    %edx,%ecx
mov    %cl,(%rax)
jmp    12b5 <backLightRamp+0x1b5>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
movzbl -0x1b(%rbp),%ecx
cmp    %ecx,%eax
jle    12a6 <backLightRamp+0x1a6>
movl   $0x0,0x2d96(%rip)
movzbl -0x1b(%rbp),%edx
mov    -0x18(%rbp),%rax
movzbl (%rax),%ecx
sub    %edx,%ecx
mov    %cl,(%rax)
jmp    12b0 <backLightRamp+0x1b0>
movl   $0x1,0x2d78(%rip)
jmp    12b5 <backLightRamp+0x1b5>
pop    %rbp
ret

x86 assembly (clang, -O2):
<backLightRamp>:
mov    (%rdi),%r10b
cmpb   $0x1,0x2f1a(%rip)
je     111d <backLightRamp+0x1d>
mov    %ecx,%eax
not    %al
cmp    %al,%r10b
jae    111d <backLightRamp+0x1d>
add    %cl,%r10b
mov    %r10b,(%rdi)
jmp    1135 <backLightRamp+0x35>
sub    %cl,%r10b
jbe    112e <backLightRamp+0x2e>
movb   $0x1,0x2efb(%rip)
mov    %r10b,(%rdi)
jmp    1135 <backLightRamp+0x35>
movb   $0x0,0x2eef(%rip)
mov    (%rsi),%al
cmpb   $0x1,0x2eea(%rip)
je     1150 <backLightRamp+0x50>
mov    %r8d,%ecx
not    %cl
cmp    %cl,%al
jae    1150 <backLightRamp+0x50>
add    %r8b,%al
mov    %al,(%rsi)
jmp    1167 <backLightRamp+0x67>
sub    %r8b,%al
jbe    1160 <backLightRamp+0x60>
movb   $0x1,0x2ecc(%rip)
mov    %al,(%rsi)
jmp    1167 <backLightRamp+0x67>
movb   $0x0,0x2ec1(%rip)
mov    (%rdx),%al
cmpb   $0x1,0x2ebc(%rip)
je     1181 <backLightRamp+0x81>
mov    %r9d,%ecx
not    %cl
cmp    %cl,%al
jae    1181 <backLightRamp+0x81>
add    %r9b,%al
mov    %al,(%rdx)
ret
sub    %r9b,%al
jbe    1190 <backLightRamp+0x90>
movb   $0x1,0x2e9f(%rip)
mov    %al,(%rdx)
ret
movb   $0x0,0x2e95(%rip)
ret

LLVM IR (-O0):
@backLightRamp.redInc = internal global i32 1
@backLightRamp.greenInc = internal global i32 1
@backLightRamp.blueInc = internal global i32 1
define void @backLightRamp(i8* %0, i8* %1, i8* %2, i8 zeroext %3, i8 zeroext %4, i8 zeroext %5) {
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i8
%11 = alloca i8
%12 = alloca i8
store i8* %0, i8** %7
store i8* %1, i8** %8
store i8* %2, i8** %9
store i8 %3, i8* %10
store i8 %4, i8* %11
store i8 %5, i8* %12
%13 = load i32, i32* @backLightRamp.redInc
%14 = icmp eq i32 %13, 1
br i1 %14, label %15, label %31
15: ; preds = %6
%16 = load i8*, i8** %7
%17 = load i8, i8* %16
%18 = zext i8 %17 to i32
%19 = load i8, i8* %10
%20 = zext i8 %19 to i32
%21 = sub nsw i32 255, %20
%22 = icmp slt i32 %18, %21
br i1 %22, label %23, label %31
23: ; preds = %15
%24 = load i8, i8* %10
%25 = zext i8 %24 to i32
%26 = load i8*, i8** %7
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = add nsw i32 %28, %25
%30 = trunc i32 %29 to i8
store i8 %30, i8* %26
br label %48
31: ; preds = %15, %6
%32 = load i8*, i8** %7
%33 = load i8, i8* %32
%34 = zext i8 %33 to i32
%35 = load i8, i8* %10
%36 = zext i8 %35 to i32
%37 = icmp sgt i32 %34, %36
br i1 %37, label %38, label %46
38: ; preds = %31
store i32 0, i32* @backLightRamp.redInc
%39 = load i8, i8* %10
%40 = zext i8 %39 to i32
%41 = load i8*, i8** %7
%42 = load i8, i8* %41
%43 = zext i8 %42 to i32
%44 = sub nsw i32 %43, %40
%45 = trunc i32 %44 to i8
store i8 %45, i8* %41
br label %47
46: ; preds = %31
store i32 1, i32* @backLightRamp.redInc
br label %47
47: ; preds = %46, %38
br label %48
48: ; preds = %47, %23
%49 = load i32, i32* @backLightRamp.greenInc
%50 = icmp eq i32 %49, 1
br i1 %50, label %51, label %67
51: ; preds = %48
%52 = load i8*, i8** %8
%53 = load i8, i8* %52
%54 = zext i8 %53 to i32
%55 = load i8, i8* %11
%56 = zext i8 %55 to i32
%57 = sub nsw i32 255, %56
%58 = icmp slt i32 %54, %57
br i1 %58, label %59, label %67
59: ; preds = %51
%60 = load i8, i8* %11
%61 = zext i8 %60 to i32
%62 = load i8*, i8** %8
%63 = load i8, i8* %62
%64 = zext i8 %63 to i32
%65 = add nsw i32 %64, %61
%66 = trunc i32 %65 to i8
store i8 %66, i8* %62
br label %84
67: ; preds = %51, %48
%68 = load i8*, i8** %8
%69 = load i8, i8* %68
%70 = zext i8 %69 to i32
%71 = load i8, i8* %11
%72 = zext i8 %71 to i32
%73 = icmp sgt i32 %70, %72
br i1 %73, label %74, label %82
74: ; preds = %67
store i32 0, i32* @backLightRamp.greenInc
%75 = load i8, i8* %11
%76 = zext i8 %75 to i32
%77 = load i8*, i8** %8
%78 = load i8, i8* %77
%79 = zext i8 %78 to i32
%80 = sub nsw i32 %79, %76
%81 = trunc i32 %80 to i8
store i8 %81, i8* %77
br label %83
82: ; preds = %67
store i32 1, i32* @backLightRamp.greenInc
br label %83
83: ; preds = %82, %74
br label %84
84: ; preds = %83, %59
%85 = load i32, i32* @backLightRamp.blueInc
%86 = icmp eq i32 %85, 1
br i1 %86, label %87, label %103
87: ; preds = %84
%88 = load i8*, i8** %9
%89 = load i8, i8* %88
%90 = zext i8 %89 to i32
%91 = load i8, i8* %12
%92 = zext i8 %91 to i32
%93 = sub nsw i32 255, %92
%94 = icmp slt i32 %90, %93
br i1 %94, label %95, label %103
95: ; preds = %87
%96 = load i8, i8* %12
%97 = zext i8 %96 to i32
%98 = load i8*, i8** %9
%99 = load i8, i8* %98
%100 = zext i8 %99 to i32
%101 = add nsw i32 %100, %97
%102 = trunc i32 %101 to i8
store i8 %102, i8* %98
br label %120
103: ; preds = %87, %84
%104 = load i8*, i8** %9
%105 = load i8, i8* %104
%106 = zext i8 %105 to i32
%107 = load i8, i8* %12
%108 = zext i8 %107 to i32
%109 = icmp sgt i32 %106, %108
br i1 %109, label %110, label %118
110: ; preds = %103
store i32 0, i32* @backLightRamp.blueInc
%111 = load i8, i8* %12
%112 = zext i8 %111 to i32
%113 = load i8*, i8** %9
%114 = load i8, i8* %113
%115 = zext i8 %114 to i32
%116 = sub nsw i32 %115, %112
%117 = trunc i32 %116 to i8
store i8 %117, i8* %113
br label %119
118: ; preds = %103
store i32 1, i32* @backLightRamp.blueInc
br label %119
119: ; preds = %118, %110
br label %120
120: ; preds = %119, %95
ret void
}

LLVM IR (-O2):
@backLightRamp.redInc = internal unnamed_addr global i1 false
@backLightRamp.greenInc = internal unnamed_addr global i1 false
@backLightRamp.blueInc = internal unnamed_addr global i1 false
define void @backLightRamp(i8* nocapture %0, i8* nocapture %1, i8* nocapture %2, i8 zeroext %3, i8 zeroext %4, i8 zeroext %5) {
%7 = load i1, i1* @backLightRamp.redInc
%8 = load i8, i8* %0
%9 = xor i1 %7, true
%10 = xor i8 %3, -1
%11 = icmp ult i8 %8, %10
%12 = select i1 %9, i1 %11, i1 false
br i1 %12, label %13, label %15
13: ; preds = %6
%14 = add i8 %8, %3
store i8 %14, i8* %0
br label %20
15: ; preds = %6
%16 = icmp ugt i8 %8, %3
br i1 %16, label %17, label %19
17: ; preds = %15
store i1 true, i1* @backLightRamp.redInc
%18 = sub i8 %8, %3
store i8 %18, i8* %0
br label %20
19: ; preds = %15
store i1 false, i1* @backLightRamp.redInc
br label %20
20: ; preds = %17, %19, %13
%21 = load i1, i1* @backLightRamp.greenInc
%22 = load i8, i8* %1
%23 = xor i1 %21, true
%24 = xor i8 %4, -1
%25 = icmp ult i8 %22, %24
%26 = select i1 %23, i1 %25, i1 false
br i1 %26, label %27, label %29
27: ; preds = %20
%28 = add i8 %22, %4
store i8 %28, i8* %1
br label %34
29: ; preds = %20
%30 = icmp ugt i8 %22, %4
br i1 %30, label %31, label %33
31: ; preds = %29
store i1 true, i1* @backLightRamp.greenInc
%32 = sub i8 %22, %4
store i8 %32, i8* %1
br label %34
33: ; preds = %29
store i1 false, i1* @backLightRamp.greenInc
br label %34
34: ; preds = %31, %33, %27
%35 = load i1, i1* @backLightRamp.blueInc
%36 = load i8, i8* %2
%37 = xor i1 %35, true
%38 = xor i8 %5, -1
%39 = icmp ult i8 %36, %38
%40 = select i1 %37, i1 %39, i1 false
br i1 %40, label %41, label %43
41: ; preds = %34
%42 = add i8 %36, %5
store i8 %42, i8* %2
br label %48
43: ; preds = %34
%44 = icmp ugt i8 %36, %5
br i1 %44, label %45, label %47
45: ; preds = %43
store i1 true, i1* @backLightRamp.blueInc
%46 = sub i8 %36, %5
store i8 %46, i8* %2
br label %48
47: ; preds = %43
store i1 false, i1* @backLightRamp.blueInc
br label %48
48: ; preds = %45, %47, %41
ret void
}