float blinkerFont(int speed, float delay) {
  int half_speed = (speed / 2);
  static int show_font = 0;
  float static alpha = 0.0f;
  if (show_font >= speed) {
    show_font = -1 * delay;
    alpha = 0.0f;
  } else if (show_font > half_speed - 1) {
    alpha = alpha - (1.0f / half_speed);
  } else if (show_font >= 0) {
    alpha = alpha + (1.0f / half_speed);
  }
  show_font++;
  return alpha;
}


x86 assembly (clang, -O0):
<blinkerFont>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movss  %xmm0,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0xc(%rbp)
mov    0x2f04(%rip),%eax
cmp    -0x4(%rbp),%eax
jl     1150 <blinkerFont+0x50>
movss  0xed3(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,0x2ee4(%rip)
xorps  %xmm0,%xmm0
movss  %xmm0,0x2edd(%rip)
jmp    11ca <blinkerFont+0xca>
mov    0x2ece(%rip),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jle    118e <blinkerFont+0x8e>
movss  0x2ebc(%rip),%xmm0
cvtsi2ssl -0xc(%rbp),%xmm2
movss  0xe87(%rip),%xmm1
divss  %xmm2,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,0x2e9f(%rip)
jmp    11c5 <blinkerFont+0xc5>
cmpl   $0x0,0x2e8f(%rip)
jl     11c0 <blinkerFont+0xc0>
movss  0x2e85(%rip),%xmm0
cvtsi2ssl -0xc(%rbp),%xmm2
movss  0xe50(%rip),%xmm1
divss  %xmm2,%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,0x2e68(%rip)
jmp    11c5 <blinkerFont+0xc5>
jmp    11ca <blinkerFont+0xca>
mov    0x2e54(%rip),%eax
add    $0x1,%eax
mov    %eax,0x2e4b(%rip)
movss  0x2e47(%rip),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<blinkerFont>:
mov    0x2f1e(%rip),%eax
cmp    %edi,%eax
jge    1139 <blinkerFont+0x39>
mov    %edi,%ecx
shr    $0x1f,%ecx
add    %edi,%ecx
sar    %ecx
cmp    %ecx,%eax
jge    1149 <blinkerFont+0x49>
movss  0x2f09(%rip),%xmm0
test   %eax,%eax
js     1169 <blinkerFont+0x69>
cvtsi2ss %ecx,%xmm1
movss  0xee5(%rip),%xmm2
divss  %xmm1,%xmm2
addss  %xmm2,%xmm0
jmp    1161 <blinkerFont+0x61>
xorps  0xec0(%rip),%xmm0
cvttss2si %xmm0,%eax
xorps  %xmm0,%xmm0
jmp    1161 <blinkerFont+0x61>
cvtsi2ss %ecx,%xmm1
movss  0xebb(%rip),%xmm0
divss  %xmm1,%xmm0
addss  0x2ec7(%rip),%xmm0
movss  %xmm0,0x2ebf(%rip)
add    $0x1,%eax
mov    %eax,0x2eb2(%rip)
ret

LLVM IR (-O0):
@blinkerFont.show_font = internal global i32 0
@blinkerFont.alpha = internal global float 0.000000e+00
define float @blinkerFont(i32 %0, float %1) {
%3 = alloca i32
%4 = alloca float
%5 = alloca i32
store i32 %0, i32* %3
store float %1, float* %4
%6 = load i32, i32* %3
%7 = sdiv i32 %6, 2
store i32 %7, i32* %5
%8 = load i32, i32* @blinkerFont.show_font
%9 = load i32, i32* %3
%10 = icmp sge i32 %8, %9
br i1 %10, label %11, label %15
11: ; preds = %2
%12 = load float, float* %4
%13 = fmul float -1.000000e+00, %12
%14 = fptosi float %13 to i32
store i32 %14, i32* @blinkerFont.show_font
store float 0.000000e+00, float* @blinkerFont.alpha
br label %37
15: ; preds = %2
%16 = load i32, i32* @blinkerFont.show_font
%17 = load i32, i32* %5
%18 = sub nsw i32 %17, 1
%19 = icmp sgt i32 %16, %18
br i1 %19, label %20, label %26
20: ; preds = %15
%21 = load float, float* @blinkerFont.alpha
%22 = load i32, i32* %5
%23 = sitofp i32 %22 to float
%24 = fdiv float 1.000000e+00, %23
%25 = fsub float %21, %24
store float %25, float* @blinkerFont.alpha
br label %36
26: ; preds = %15
%27 = load i32, i32* @blinkerFont.show_font
%28 = icmp sge i32 %27, 0
br i1 %28, label %29, label %35
29: ; preds = %26
%30 = load float, float* @blinkerFont.alpha
%31 = load i32, i32* %5
%32 = sitofp i32 %31 to float
%33 = fdiv float 1.000000e+00, %32
%34 = fadd float %30, %33
store float %34, float* @blinkerFont.alpha
br label %35
35: ; preds = %29, %26
br label %36
36: ; preds = %35, %20
br label %37
37: ; preds = %36, %11
%38 = load i32, i32* @blinkerFont.show_font
%39 = add nsw i32 %38, 1
store i32 %39, i32* @blinkerFont.show_font
%40 = load float, float* @blinkerFont.alpha
ret float %40
}

LLVM IR (-O2):
@blinkerFont.show_font = internal unnamed_addr global i32 0
@blinkerFont.alpha = internal unnamed_addr global float 0.000000e+00
define float @blinkerFont(i32 %0, float %1) {
%3 = sdiv i32 %0, 2
%4 = load i32, i32* @blinkerFont.show_font
%5 = icmp slt i32 %4, %0
br i1 %5, label %9, label %6
6: ; preds = %2
%7 = fneg float %1
%8 = fptosi float %7 to i32
br label %23
9: ; preds = %2
%10 = icmp slt i32 %4, %3
br i1 %10, label %16, label %11
11: ; preds = %9
%12 = load float, float* @blinkerFont.alpha
%13 = sitofp i32 %3 to float
%14 = fdiv float 1.000000e+00, %13
%15 = fsub float %12, %14
br label %23
16: ; preds = %9
%17 = icmp sgt i32 %4, -1
%18 = load float, float* @blinkerFont.alpha
br i1 %17, label %19, label %26
19: ; preds = %16
%20 = sitofp i32 %3 to float
%21 = fdiv float 1.000000e+00, %20
%22 = fadd float %21, %18
br label %23
23: ; preds = %6, %19, %11
%24 = phi float [ %15, %11 ], [ %22, %19 ], [ 0.000000e+00, %6 ]
%25 = phi i32 [ %4, %11 ], [ %4, %19 ], [ %8, %6 ]
store float %24, float* @blinkerFont.alpha
br label %26
26: ; preds = %23, %16
%27 = phi float [ %18, %16 ], [ %24, %23 ]
%28 = phi i32 [ %4, %16 ], [ %25, %23 ]
%29 = add nsw i32 %28, 1
store i32 %29, i32* @blinkerFont.show_font
ret float %27
}