#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 powl(long double, long double);
long double Fn(long double x) {
  return 3 * powl(x, 5.0L) + 2 * powl(x, 4.0L) - 5 * powl(x, 3.0L) -
         powl(x, 2.0L) + 7 * x - 6;
}


x86 assembly (clang, -O0):
<Fn>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
fldt   0x10(%rbp)
fstpt  -0x10(%rbp)
fldt   -0x10(%rbp)
mov    %rsp,%rax
flds   0xed6(%rip)
fstpt  0x10(%rax)
fstpt  (%rax)
call   1030 <powl@plt>
mov    %eax,%ecx
mov    %ecx,%eax
lea    (%rax,%rax,2),%eax
mov    %eax,-0x20(%rbp)
fldt   -0x10(%rbp)
mov    %rsp,%rax
flds   0xeba(%rip)
fstpt  0x10(%rax)
fstpt  (%rax)
call   1030 <powl@plt>
mov    -0x20(%rbp),%ecx
mov    %eax,%edx
mov    %ecx,%eax
mov    %edx,%ecx
lea    (%rax,%rcx,2),%eax
mov    %eax,-0x1c(%rbp)
fldt   -0x10(%rbp)
mov    %rsp,%rax
flds   0xe99(%rip)
fstpt  0x10(%rax)
fstpt  (%rax)
call   1030 <powl@plt>
mov    %eax,%edx
mov    -0x1c(%rbp),%eax
mov    %edx,%ecx
lea    (%rcx,%rcx,4),%ecx
sub    %ecx,%eax
mov    %eax,-0x18(%rbp)
fldt   -0x10(%rbp)
mov    %rsp,%rax
flds   0xe78(%rip)
fstpt  0x10(%rax)
fstpt  (%rax)
call   1030 <powl@plt>
mov    %eax,%ecx
mov    -0x18(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
fildl  -0x14(%rbp)
fldt   -0x10(%rbp)
flds   0xe5c(%rip)
fmulp  %st,%st(1)
faddp  %st,%st(1)
flds   0xe56(%rip)
faddp  %st,%st(1)
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Fn>:
push   %rbx
sub    $0x30,%rsp
fldt   0x40(%rsp)
fld    %st(0)
fstpt  0x20(%rsp)
flds   0xedb(%rip)
fstpt  0x10(%rsp)
fstpt  (%rsp)
call   1030 <powl@plt>
lea    (%rax,%rax,2),%ebx
flds   0xeca(%rip)
fstpt  0x10(%rsp)
fldt   0x20(%rsp)
fstpt  (%rsp)
call   1030 <powl@plt>
lea    (%rbx,%rax,2),%ebx
flds   0xeb5(%rip)
fstpt  0x10(%rsp)
fldt   0x20(%rsp)
fstpt  (%rsp)
call   1030 <powl@plt>
lea    (%rax,%rax,4),%eax
sub    %eax,%ebx
flds   0xe9e(%rip)
fstpt  0x10(%rsp)
fldt   0x20(%rsp)
fstpt  (%rsp)
call   1030 <powl@plt>
sub    %eax,%ebx
mov    %ebx,0x2c(%rsp)
fldt   0x20(%rsp)
fmuls  0xe82(%rip)
fiaddl 0x2c(%rsp)
fadds  0xe7c(%rip)
add    $0x30,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define x86_fp80 @Fn(x86_fp80 %0) {
%2 = alloca x86_fp80
store x86_fp80 %0, x86_fp80* %2
%3 = load x86_fp80, x86_fp80* %2
%4 = call i32 @powl(x86_fp80 %3, x86_fp80 0xK4001A000000000000000)
%5 = mul nsw i32 3, %4
%6 = load x86_fp80, x86_fp80* %2
%7 = call i32 @powl(x86_fp80 %6, x86_fp80 0xK40018000000000000000)
%8 = mul nsw i32 2, %7
%9 = add nsw i32 %5, %8
%10 = load x86_fp80, x86_fp80* %2
%11 = call i32 @powl(x86_fp80 %10, x86_fp80 0xK4000C000000000000000)
%12 = mul nsw i32 5, %11
%13 = sub nsw i32 %9, %12
%14 = load x86_fp80, x86_fp80* %2
%15 = call i32 @powl(x86_fp80 %14, x86_fp80 0xK40008000000000000000)
%16 = sub nsw i32 %13, %15
%17 = sitofp i32 %16 to x86_fp80
%18 = load x86_fp80, x86_fp80* %2
%19 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 0xK4001E000000000000000, x86_fp80 %18, x86_fp80 %17)
%20 = fsub x86_fp80 %19, 0xK4001C000000000000000
ret x86_fp80 %20
}

LLVM IR (-O2):
define x86_fp80 @Fn(x86_fp80 %0) {
%2 = tail call i32 @powl(x86_fp80 %0, x86_fp80 0xK4001A000000000000000)
%3 = mul nsw i32 %2, 3
%4 = tail call i32 @powl(x86_fp80 %0, x86_fp80 0xK40018000000000000000)
%5 = shl nsw i32 %4, 1
%6 = add nsw i32 %5, %3
%7 = tail call i32 @powl(x86_fp80 %0, x86_fp80 0xK4000C000000000000000)
%8 = mul i32 %7, -5
%9 = add i32 %6, %8
%10 = tail call i32 @powl(x86_fp80 %0, x86_fp80 0xK40008000000000000000)
%11 = sub i32 %9, %10
%12 = sitofp i32 %11 to x86_fp80
%13 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %0, x86_fp80 0xK4001E000000000000000, x86_fp80 %12)
%14 = fadd x86_fp80 %13, 0xKC001C000000000000000
ret x86_fp80 %14
}