void checkRightImpact(float ballY, float *ballX, float RIGHT_IMPACT_X,
                      float *ballDeltaY, float *ballDeltaX, int BALL_DIAMETER,
                      float rightPadY, int PAD_HEIGHT, float MAX_BALL_Y_SPEED) {
  float ballImpactY =
      ballY - (*ballX - RIGHT_IMPACT_X) * (*ballDeltaY / *ballDeltaX);
  if (ballImpactY + BALL_DIAMETER - 1 >= rightPadY &&
      ballImpactY <= rightPadY + PAD_HEIGHT - 1 &&
      *ballX - *ballDeltaX <= RIGHT_IMPACT_X) {
    float impactSection = (ballImpactY - (rightPadY - BALL_DIAMETER + 1)) * 8 /
                          (PAD_HEIGHT + BALL_DIAMETER);
    if (impactSection <= 1) {
      *ballDeltaY = -MAX_BALL_Y_SPEED;
    } else if (impactSection <= 2) {
      *ballDeltaY = -MAX_BALL_Y_SPEED * 3 / 4;
    } else if (impactSection <= 3) {
      *ballDeltaY = -MAX_BALL_Y_SPEED * 2 / 4;
    } else if (impactSection <= 4) {
      *ballDeltaY = -MAX_BALL_Y_SPEED / 4;
    } else if (impactSection <= 5) {
      *ballDeltaY = MAX_BALL_Y_SPEED / 4;
    } else if (impactSection <= 6) {
      *ballDeltaY = MAX_BALL_Y_SPEED * 2 / 4;
    } else if (impactSection <= 7) {
      *ballDeltaY = MAX_BALL_Y_SPEED * 3 / 4;
    } else if (impactSection <= 8) {
      *ballDeltaY = MAX_BALL_Y_SPEED;
    }
    *ballX = RIGHT_IMPACT_X - (*ballX - RIGHT_IMPACT_X);
    if (*ballDeltaX * 1.05 < 1) {
      *ballDeltaX *= 1.05;
    }
    *ballDeltaX *= -1.0;
  }
  return;
}


x86 assembly (clang, -O0):
<checkRightImpact>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
mov    %rdi,-0x10(%rbp)
movss  %xmm1,-0x14(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %ecx,-0x2c(%rbp)
movss  %xmm2,-0x30(%rbp)
mov    %r8d,-0x34(%rbp)
movss  %xmm3,-0x38(%rbp)
movss  -0x4(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
subss  -0x14(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm2
mov    -0x28(%rbp),%rax
divss  (%rax),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
cvtsi2ssl -0x2c(%rbp),%xmm1
addss  %xmm1,%xmm0
movss  0xe83(%rip),%xmm1
subss  %xmm1,%xmm0
ucomiss -0x30(%rbp),%xmm0
jb     147d <checkRightImpact+0x37d>
movss  -0x3c(%rbp),%xmm1
movss  -0x30(%rbp),%xmm0
cvtsi2ssl -0x34(%rbp),%xmm2
addss  %xmm2,%xmm0
movss  0xe5a(%rip),%xmm2
subss  %xmm2,%xmm0
ucomiss %xmm1,%xmm0
jb     147d <checkRightImpact+0x37d>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm1
mov    -0x28(%rbp),%rax
subss  (%rax),%xmm1
movss  -0x14(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     147d <checkRightImpact+0x37d>
movss  -0x3c(%rbp),%xmm0
movss  -0x30(%rbp),%xmm1
cvtsi2ssl -0x2c(%rbp),%xmm2
subss  %xmm2,%xmm1
movss  0xe14(%rip),%xmm2
addss  %xmm2,%xmm1
subss  %xmm1,%xmm0
movss  0xe08(%rip),%xmm1
mulss  %xmm1,%xmm0
mov    -0x34(%rbp),%eax
add    -0x2c(%rbp),%eax
cvtsi2ss %eax,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  0xde5(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     1244 <checkRightImpact+0x144>
movss  -0x38(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13f5 <checkRightImpact+0x2f5>
movss  0xdbc(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     128d <checkRightImpact+0x18d>
movss  -0x38(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  0xd9c(%rip),%xmm1
mulss  %xmm1,%xmm0
movss  0xd94(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13f0 <checkRightImpact+0x2f0>
movss  0xd77(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     12d6 <checkRightImpact+0x1d6>
movss  -0x38(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  0xd4f(%rip),%xmm1
mulss  %xmm1,%xmm0
movss  0xd4b(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13eb <checkRightImpact+0x2eb>
movss  0xd32(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     1313 <checkRightImpact+0x213>
movss  -0x38(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  0xd0e(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13e6 <checkRightImpact+0x2e6>
movss  0xcf9(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     1343 <checkRightImpact+0x243>
movss  -0x38(%rbp),%xmm0
movss  0xcde(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13e1 <checkRightImpact+0x2e1>
movss  0xccd(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     137b <checkRightImpact+0x27b>
movss  0xcab(%rip),%xmm0
mulss  -0x38(%rbp),%xmm0
movss  0xca6(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13dc <checkRightImpact+0x2dc>
movss  0xc99(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     13b3 <checkRightImpact+0x2b3>
movss  0xc77(%rip),%xmm0
mulss  -0x38(%rbp),%xmm0
movss  0xc6e(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13d7 <checkRightImpact+0x2d7>
movss  0xc49(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     13d2 <checkRightImpact+0x2d2>
movss  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13d7 <checkRightImpact+0x2d7>
jmp    13dc <checkRightImpact+0x2dc>
jmp    13e1 <checkRightImpact+0x2e1>
jmp    13e6 <checkRightImpact+0x2e6>
jmp    13eb <checkRightImpact+0x2eb>
jmp    13f0 <checkRightImpact+0x2f0>
jmp    13f5 <checkRightImpact+0x2f5>
movss  -0x14(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm1
subss  -0x14(%rbp),%xmm1
subss  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xc01(%rip),%xmm0
mulsd  %xmm0,%xmm1
movsd  0xbed(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    145d <checkRightImpact+0x35d>
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xbd7(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xbbf(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<checkRightImpact>:
movss  (%rdi),%xmm4
movaps %xmm4,%xmm6
subss  %xmm1,%xmm6
movss  (%rsi),%xmm7
movss  (%rdx),%xmm5
divss  %xmm5,%xmm7
mulss  %xmm6,%xmm7
subss  %xmm7,%xmm0
xorps  %xmm6,%xmm6
cvtsi2ss %ecx,%xmm6
movaps %xmm0,%xmm7
addss  %xmm6,%xmm7
addss  0xecb(%rip),%xmm7
ucomiss %xmm2,%xmm7
jb     126b <checkRightImpact+0x16b>
xorps  %xmm7,%xmm7
cvtsi2ss %r8d,%xmm7
addss  %xmm2,%xmm7
addss  0xeae(%rip),%xmm7
ucomiss %xmm0,%xmm7
jb     126b <checkRightImpact+0x16b>
subss  %xmm5,%xmm4
ucomiss %xmm4,%xmm1
jb     126b <checkRightImpact+0x16b>
subss  %xmm6,%xmm2
movss  0xe90(%rip),%xmm4
addss  %xmm4,%xmm2
subss  %xmm2,%xmm0
mulss  0xe84(%rip),%xmm0
add    %ecx,%r8d
xorps  %xmm2,%xmm2
cvtsi2ss %r8d,%xmm2
divss  %xmm2,%xmm0
ucomiss %xmm0,%xmm4
jae    1201 <checkRightImpact+0x101>
movss  0xe6c(%rip),%xmm2
ucomiss %xmm0,%xmm2
jae    120a <checkRightImpact+0x10a>
movss  0xe6b(%rip),%xmm2
ucomiss %xmm0,%xmm2
jae    1214 <checkRightImpact+0x114>
movss  0xe66(%rip),%xmm2
ucomiss %xmm0,%xmm2
jae    126c <checkRightImpact+0x16c>
movss  0xe5d(%rip),%xmm2
ucomiss %xmm0,%xmm2
jae    121c <checkRightImpact+0x11c>
movss  0xe54(%rip),%xmm2
ucomiss %xmm0,%xmm2
jae    1276 <checkRightImpact+0x176>
movss  0xe47(%rip),%xmm2
ucomiss %xmm0,%xmm2
jae    127c <checkRightImpact+0x17c>
movss  0xe0e(%rip),%xmm2
ucomiss %xmm0,%xmm2
jae    1224 <checkRightImpact+0x124>
jmp    1228 <checkRightImpact+0x128>
xorps  0xe38(%rip),%xmm3
jmp    1224 <checkRightImpact+0x124>
mulss  0xdfe(%rip),%xmm3
jmp    121c <checkRightImpact+0x11c>
mulss  0xe00(%rip),%xmm3
mulss  0xdf0(%rip),%xmm3
movss  %xmm3,(%rsi)
movss  (%rdi),%xmm0
subss  %xmm1,%xmm0
subss  %xmm0,%xmm1
movss  %xmm1,(%rdi)
movss  (%rdx),%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm0,%xmm1
mulsd  0xe05(%rip),%xmm1
movsd  0xe05(%rip),%xmm2
ucomisd %xmm1,%xmm2
jbe    1260 <checkRightImpact+0x160>
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
xorps  0xdd9(%rip),%xmm0
movss  %xmm0,(%rdx)
ret
mulss  0xdb0(%rip),%xmm3
jmp    1224 <checkRightImpact+0x124>
addss  %xmm3,%xmm3
jmp    121c <checkRightImpact+0x11c>
mulss  0xd94(%rip),%xmm3
jmp    121c <checkRightImpact+0x11c>

LLVM IR (-O0):
define void @checkRightImpact(float %0, float* %1, float %2, float* %3, float* %4, i32 %5, float %6, i32 %7, float %8) {
%10 = alloca float
%11 = alloca float*
%12 = alloca float
%13 = alloca float*
%14 = alloca float*
%15 = alloca i32
%16 = alloca float
%17 = alloca i32
%18 = alloca float
%19 = alloca float
%20 = alloca float
store float %0, float* %10
store float* %1, float** %11
store float %2, float* %12
store float* %3, float** %13
store float* %4, float** %14
store i32 %5, i32* %15
store float %6, float* %16
store i32 %7, i32* %17
store float %8, float* %18
%21 = load float, float* %10
%22 = load float*, float** %11
%23 = load float, float* %22
%24 = load float, float* %12
%25 = fsub float %23, %24
%26 = load float*, float** %13
%27 = load float, float* %26
%28 = load float*, float** %14
%29 = load float, float* %28
%30 = fdiv float %27, %29
%31 = fneg float %25
%32 = call float @llvm.fmuladd.f32(float %31, float %30, float %21)
store float %32, float* %19
%33 = load float, float* %19
%34 = load i32, i32* %15
%35 = sitofp i32 %34 to float
%36 = fadd float %33, %35
%37 = fsub float %36, 1.000000e+00
%38 = load float, float* %16
%39 = fcmp oge float %37, %38
br i1 %39, label %40, label %163
40: ; preds = %9
%41 = load float, float* %19
%42 = load float, float* %16
%43 = load i32, i32* %17
%44 = sitofp i32 %43 to float
%45 = fadd float %42, %44
%46 = fsub float %45, 1.000000e+00
%47 = fcmp ole float %41, %46
br i1 %47, label %48, label %163
48: ; preds = %40
%49 = load float*, float** %11
%50 = load float, float* %49
%51 = load float*, float** %14
%52 = load float, float* %51
%53 = fsub float %50, %52
%54 = load float, float* %12
%55 = fcmp ole float %53, %54
br i1 %55, label %56, label %163
56: ; preds = %48
%57 = load float, float* %19
%58 = load float, float* %16
%59 = load i32, i32* %15
%60 = sitofp i32 %59 to float
%61 = fsub float %58, %60
%62 = fadd float %61, 1.000000e+00
%63 = fsub float %57, %62
%64 = fmul float %63, 8.000000e+00
%65 = load i32, i32* %17
%66 = load i32, i32* %15
%67 = add nsw i32 %65, %66
%68 = sitofp i32 %67 to float
%69 = fdiv float %64, %68
store float %69, float* %20
%70 = load float, float* %20
%71 = fcmp ole float %70, 1.000000e+00
br i1 %71, label %72, label %76
72: ; preds = %56
%73 = load float, float* %18
%74 = fneg float %73
%75 = load float*, float** %13
store float %74, float* %75
br label %138
76: ; preds = %56
%77 = load float, float* %20
%78 = fcmp ole float %77, 2.000000e+00
br i1 %78, label %79, label %85
79: ; preds = %76
%80 = load float, float* %18
%81 = fneg float %80
%82 = fmul float %81, 3.000000e+00
%83 = fdiv float %82, 4.000000e+00
%84 = load float*, float** %13
store float %83, float* %84
br label %137
85: ; preds = %76
%86 = load float, float* %20
%87 = fcmp ole float %86, 3.000000e+00
br i1 %87, label %88, label %94
88: ; preds = %85
%89 = load float, float* %18
%90 = fneg float %89
%91 = fmul float %90, 2.000000e+00
%92 = fdiv float %91, 4.000000e+00
%93 = load float*, float** %13
store float %92, float* %93
br label %136
94: ; preds = %85
%95 = load float, float* %20
%96 = fcmp ole float %95, 4.000000e+00
br i1 %96, label %97, label %102
97: ; preds = %94
%98 = load float, float* %18
%99 = fneg float %98
%100 = fdiv float %99, 4.000000e+00
%101 = load float*, float** %13
store float %100, float* %101
br label %135
102: ; preds = %94
%103 = load float, float* %20
%104 = fcmp ole float %103, 5.000000e+00
br i1 %104, label %105, label %109
105: ; preds = %102
%106 = load float, float* %18
%107 = fdiv float %106, 4.000000e+00
%108 = load float*, float** %13
store float %107, float* %108
br label %134
109: ; preds = %102
%110 = load float, float* %20
%111 = fcmp ole float %110, 6.000000e+00
br i1 %111, label %112, label %117
112: ; preds = %109
%113 = load float, float* %18
%114 = fmul float %113, 2.000000e+00
%115 = fdiv float %114, 4.000000e+00
%116 = load float*, float** %13
store float %115, float* %116
br label %133
117: ; preds = %109
%118 = load float, float* %20
%119 = fcmp ole float %118, 7.000000e+00
br i1 %119, label %120, label %125
120: ; preds = %117
%121 = load float, float* %18
%122 = fmul float %121, 3.000000e+00
%123 = fdiv float %122, 4.000000e+00
%124 = load float*, float** %13
store float %123, float* %124
br label %132
125: ; preds = %117
%126 = load float, float* %20
%127 = fcmp ole float %126, 8.000000e+00
br i1 %127, label %128, label %131
128: ; preds = %125
%129 = load float, float* %18
%130 = load float*, float** %13
store float %129, float* %130
br label %131
131: ; preds = %128, %125
br label %132
132: ; preds = %131, %120
br label %133
133: ; preds = %132, %112
br label %134
134: ; preds = %133, %105
br label %135
135: ; preds = %134, %97
br label %136
136: ; preds = %135, %88
br label %137
137: ; preds = %136, %79
br label %138
138: ; preds = %137, %72
%139 = load float, float* %12
%140 = load float*, float** %11
%141 = load float, float* %140
%142 = load float, float* %12
%143 = fsub float %141, %142
%144 = fsub float %139, %143
%145 = load float*, float** %11
store float %144, float* %145
%146 = load float*, float** %14
%147 = load float, float* %146
%148 = fpext float %147 to double
%149 = fmul double %148, 1.050000e+00
%150 = fcmp olt double %149, 1.000000e+00
br i1 %150, label %151, label %157
151: ; preds = %138
%152 = load float*, float** %14
%153 = load float, float* %152
%154 = fpext float %153 to double
%155 = fmul double %154, 1.050000e+00
%156 = fptrunc double %155 to float
store float %156, float* %152
br label %157
157: ; preds = %151, %138
%158 = load float*, float** %14
%159 = load float, float* %158
%160 = fpext float %159 to double
%161 = fmul double %160, -1.000000e+00
%162 = fptrunc double %161 to float
store float %162, float* %158
br label %163
163: ; preds = %157, %48, %40, %9
ret void
}

LLVM IR (-O2):
define void @checkRightImpact(float %0, float* nocapture %1, float %2, float* nocapture %3, float* nocapture %4, i32 %5, float %6, i32 %7, float %8) {
%10 = load float, float* %1
%11 = fsub float %10, %2
%12 = load float, float* %3
%13 = load float, float* %4
%14 = fdiv float %12, %13
%15 = fneg float %11
%16 = tail call float @llvm.fmuladd.f32(float %15, float %14, float %0)
%17 = sitofp i32 %5 to float
%18 = fadd float %16, %17
%19 = fadd float %18, -1.000000e+00
%20 = fcmp ult float %19, %6
br i1 %20, label %83, label %21
21: ; preds = %9
%22 = sitofp i32 %7 to float
%23 = fadd float %22, %6
%24 = fadd float %23, -1.000000e+00
%25 = fcmp ugt float %16, %24
%26 = fsub float %10, %13
%27 = fcmp ugt float %26, %2
%28 = select i1 %25, i1 true, i1 %27
br i1 %28, label %83, label %29
29: ; preds = %21
%30 = fsub float %6, %17
%31 = fadd float %30, 1.000000e+00
%32 = fsub float %16, %31
%33 = fmul float %32, 8.000000e+00
%34 = add nsw i32 %7, %5
%35 = sitofp i32 %34 to float
%36 = fdiv float %33, %35
%37 = fcmp ugt float %36, 1.000000e+00
br i1 %37, label %40, label %38
38: ; preds = %29
%39 = fneg float %8
br label %70
40: ; preds = %29
%41 = fcmp ugt float %36, 2.000000e+00
br i1 %41, label %45, label %42
42: ; preds = %40
%43 = fmul float %8, -3.000000e+00
%44 = fmul float %43, 2.500000e-01
br label %70
45: ; preds = %40
%46 = fcmp ugt float %36, 3.000000e+00
br i1 %46, label %50, label %47
47: ; preds = %45
%48 = fmul float %8, -2.000000e+00
%49 = fmul float %48, 2.500000e-01
br label %70
50: ; preds = %45
%51 = fcmp ugt float %36, 4.000000e+00
br i1 %51, label %54, label %52
52: ; preds = %50
%53 = fmul float %8, -2.500000e-01
br label %70
54: ; preds = %50
%55 = fcmp ugt float %36, 5.000000e+00
br i1 %55, label %58, label %56
56: ; preds = %54
%57 = fmul float %8, 2.500000e-01
br label %70
58: ; preds = %54
%59 = fcmp ugt float %36, 6.000000e+00
br i1 %59, label %63, label %60
60: ; preds = %58
%61 = fmul float %8, 2.000000e+00
%62 = fmul float %61, 2.500000e-01
br label %70
63: ; preds = %58
%64 = fcmp ugt float %36, 7.000000e+00
br i1 %64, label %68, label %65
65: ; preds = %63
%66 = fmul float %8, 3.000000e+00
%67 = fmul float %66, 2.500000e-01
br label %70
68: ; preds = %63
%69 = fcmp ugt float %36, 8.000000e+00
br i1 %69, label %72, label %70
70: ; preds = %68, %38, %47, %56, %65, %60, %52, %42
%71 = phi float [ %44, %42 ], [ %53, %52 ], [ %62, %60 ], [ %67, %65 ], [ %57, %56 ], [ %49, %47 ], [ %39, %38 ], [ %8, %68 ]
store float %71, float* %3
br label %72
72: ; preds = %70, %68
%73 = load float, float* %1
%74 = fsub float %73, %2
%75 = fsub float %2, %74
store float %75, float* %1
%76 = load float, float* %4
%77 = fpext float %76 to double
%78 = fmul double %77, 1.050000e+00
%79 = fcmp olt double %78, 1.000000e+00
%80 = fptrunc double %78 to float
%81 = select i1 %79, float %80, float %76
%82 = fneg float %81
store float %82, float* %4
br label %83
83: ; preds = %72, %21, %9
ret void
}