#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ draw_trim_box(int, int, int, int);
void draw_trim_box_opening(int left, int top, int right, int bottom,
                           float amount) {
  int x = (left + right) >> 1;
  int y = (top + bottom) >> 1;
  left = (x * (1.0 - amount)) + (left * amount);
  right = (x * (1.0 - amount)) + (right * amount);
  top = (y * (1.0 - amount)) + (top * amount);
  bottom = (y * (1.0 - amount)) + (bottom * amount);
  draw_trim_box(left, top, right, bottom);
}


x86 assembly (clang, -O0):
<draw_trim_box_opening>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
mov    -0x4(%rbp),%eax
add    -0xc(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x1c(%rbp)
cvtsi2sdl -0x18(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xea9(%rip),%xmm2
subsd  %xmm1,%xmm2
cvtsi2ssl -0x4(%rbp),%xmm1
mulss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x4(%rbp)
cvtsi2sdl -0x18(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe72(%rip),%xmm2
subsd  %xmm1,%xmm2
cvtsi2ssl -0xc(%rbp),%xmm1
mulss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0xc(%rbp)
cvtsi2sdl -0x1c(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe3b(%rip),%xmm2
subsd  %xmm1,%xmm2
cvtsi2ssl -0x8(%rbp),%xmm1
mulss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x8(%rbp)
cvtsi2sdl -0x1c(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe04(%rip),%xmm2
subsd  %xmm1,%xmm2
cvtsi2ssl -0x10(%rbp),%xmm1
mulss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x10(%rbp)
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
mov    -0xc(%rbp),%edx
mov    -0x10(%rbp),%ecx
call   1030 <draw_trim_box@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<draw_trim_box_opening>:
lea    (%rdx,%rdi,1),%eax
sar    %eax
lea    (%rcx,%rsi,1),%r8d
cvtss2sd %xmm0,%xmm1
movsd  0xedb(%rip),%xmm2
subsd  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtsi2ss %edi,%xmm1
cvtsi2sd %eax,%xmm3
mulss  %xmm0,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm3
addsd  %xmm3,%xmm1
cvttsd2si %xmm1,%edi
xorps  %xmm1,%xmm1
cvtsi2ss %edx,%xmm1
mulss  %xmm0,%xmm1
cvtss2sd %xmm1,%xmm1
addsd  %xmm3,%xmm1
cvttsd2si %xmm1,%edx
sar    %r8d
xorps  %xmm1,%xmm1
cvtsi2ss %esi,%xmm1
xorps  %xmm3,%xmm3
cvtsi2sd %r8d,%xmm3
mulss  %xmm0,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm3
addsd  %xmm3,%xmm1
cvttsd2si %xmm1,%esi
xorps  %xmm1,%xmm1
cvtsi2ss %ecx,%xmm1
mulss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
addsd  %xmm3,%xmm0
cvttsd2si %xmm0,%ecx
jmp    1030 <draw_trim_box@plt>

LLVM IR (-O0):
define void @draw_trim_box_opening(i32 %0, i32 %1, i32 %2, i32 %3, float %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca float
%11 = alloca i32
%12 = alloca i32
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store float %4, float* %10
%13 = load i32, i32* %6
%14 = load i32, i32* %8
%15 = add nsw i32 %13, %14
%16 = ashr i32 %15, 1
store i32 %16, i32* %11
%17 = load i32, i32* %7
%18 = load i32, i32* %9
%19 = add nsw i32 %17, %18
%20 = ashr i32 %19, 1
store i32 %20, i32* %12
%21 = load i32, i32* %11
%22 = sitofp i32 %21 to double
%23 = load float, float* %10
%24 = fpext float %23 to double
%25 = fsub double 1.000000e+00, %24
%26 = load i32, i32* %6
%27 = sitofp i32 %26 to float
%28 = load float, float* %10
%29 = fmul float %27, %28
%30 = fpext float %29 to double
%31 = call double @llvm.fmuladd.f64(double %22, double %25, double %30)
%32 = fptosi double %31 to i32
store i32 %32, i32* %6
%33 = load i32, i32* %11
%34 = sitofp i32 %33 to double
%35 = load float, float* %10
%36 = fpext float %35 to double
%37 = fsub double 1.000000e+00, %36
%38 = load i32, i32* %8
%39 = sitofp i32 %38 to float
%40 = load float, float* %10
%41 = fmul float %39, %40
%42 = fpext float %41 to double
%43 = call double @llvm.fmuladd.f64(double %34, double %37, double %42)
%44 = fptosi double %43 to i32
store i32 %44, i32* %8
%45 = load i32, i32* %12
%46 = sitofp i32 %45 to double
%47 = load float, float* %10
%48 = fpext float %47 to double
%49 = fsub double 1.000000e+00, %48
%50 = load i32, i32* %7
%51 = sitofp i32 %50 to float
%52 = load float, float* %10
%53 = fmul float %51, %52
%54 = fpext float %53 to double
%55 = call double @llvm.fmuladd.f64(double %46, double %49, double %54)
%56 = fptosi double %55 to i32
store i32 %56, i32* %7
%57 = load i32, i32* %12
%58 = sitofp i32 %57 to double
%59 = load float, float* %10
%60 = fpext float %59 to double
%61 = fsub double 1.000000e+00, %60
%62 = load i32, i32* %9
%63 = sitofp i32 %62 to float
%64 = load float, float* %10
%65 = fmul float %63, %64
%66 = fpext float %65 to double
%67 = call double @llvm.fmuladd.f64(double %58, double %61, double %66)
%68 = fptosi double %67 to i32
store i32 %68, i32* %9
%69 = load i32, i32* %6
%70 = load i32, i32* %7
%71 = load i32, i32* %8
%72 = load i32, i32* %9
%73 = call i32 @draw_trim_box(i32 %69, i32 %70, i32 %71, i32 %72)
ret void
}

LLVM IR (-O2):
define void @draw_trim_box_opening(i32 %0, i32 %1, i32 %2, i32 %3, float %4) {
%6 = add nsw i32 %2, %0
%7 = ashr i32 %6, 1
%8 = add nsw i32 %3, %1
%9 = ashr i32 %8, 1
%10 = sitofp i32 %7 to double
%11 = fpext float %4 to double
%12 = fsub double 1.000000e+00, %11
%13 = sitofp i32 %0 to float
%14 = fmul float %13, %4
%15 = fpext float %14 to double
%16 = tail call double @llvm.fmuladd.f64(double %10, double %12, double %15)
%17 = fptosi double %16 to i32
%18 = sitofp i32 %2 to float
%19 = fmul float %18, %4
%20 = fpext float %19 to double
%21 = tail call double @llvm.fmuladd.f64(double %10, double %12, double %20)
%22 = fptosi double %21 to i32
%23 = sitofp i32 %9 to double
%24 = sitofp i32 %1 to float
%25 = fmul float %24, %4
%26 = fpext float %25 to double
%27 = tail call double @llvm.fmuladd.f64(double %23, double %12, double %26)
%28 = fptosi double %27 to i32
%29 = sitofp i32 %3 to float
%30 = fmul float %29, %4
%31 = fpext float %30 to double
%32 = tail call double @llvm.fmuladd.f64(double %23, double %12, double %31)
%33 = fptosi double %32 to i32
%34 = tail call i32 @draw_trim_box(i32 %17, i32 %28, i32 %22, i32 %33)
ret void
}