#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 printf(char *, double, long double, long double, long double, long double,
           long double);
int main(void) {
  double c1 = -15.3L;
  long double c2 = 22.5f;
  long double a = (long double)c1 + c2, b = c1 - c2, c = c1 * c2, d = c1 / c2;
  return printf("(%f, %Lf), %Lf, %Lf, %Lf, %Lf\n", c1, c2, a, b, c, d);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
movl   $0x0,-0x4(%rbp)
movabs $0xc02e99999999999a,%rax
99 2e c0
mov    %rax,-0x10(%rbp)
flds   0xeca(%rip)
fstpt  -0x20(%rbp)
fldl   -0x10(%rbp)
fldt   -0x20(%rbp)
faddp  %st,%st(1)
fstpt  -0x30(%rbp)
fldl   -0x10(%rbp)
fldt   -0x20(%rbp)
fsubrp %st,%st(1)
fstpt  -0x40(%rbp)
fldl   -0x10(%rbp)
fldt   -0x20(%rbp)
fmulp  %st,%st(1)
fstpt  -0x50(%rbp)
fldl   -0x10(%rbp)
fldt   -0x20(%rbp)
fdivrp %st,%st(1)
fstpt  -0x60(%rbp)
movsd  -0x10(%rbp),%xmm0
fldt   -0x20(%rbp)
fldt   -0x30(%rbp)
fldt   -0x40(%rbp)
fldt   -0x50(%rbp)
fldt   -0x60(%rbp)
mov    %rsp,%rax
fstpt  0x40(%rax)
fstpt  0x30(%rax)
fstpt  0x20(%rax)
fstpt  0x10(%rax)
fstpt  (%rax)
lea    0xe73(%rip),%rdi
call   1030 <printf@plt>
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
sub    $0x58,%rsp
fldt   0xee6(%rip)
fstpt  0x40(%rsp)
fldt   0xeec(%rip)
fstpt  0x30(%rsp)
fldt   0xef2(%rip)
fstpt  0x20(%rsp)
fldl   0xef8(%rip)
fstpt  0x10(%rsp)
flds   0xefe(%rip)
fstpt  (%rsp)
lea    0xef8(%rip),%rdi
movsd  0xee4(%rip),%xmm0
call   1030 <printf@plt>
add    $0x58,%rsp
ret

LLVM IR (-O0):
@.str = [31 x i8] c"(%f, %Lf), %Lf, %Lf, %Lf, %Lf\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca double
%3 = alloca x86_fp80
%4 = alloca x86_fp80
%5 = alloca x86_fp80
%6 = alloca x86_fp80
%7 = alloca x86_fp80
store i32 0, i32* %1
store double -1.530000e+01, double* %2
store x86_fp80 0xK4003B400000000000000, x86_fp80* %3
%8 = load double, double* %2
%9 = fpext double %8 to x86_fp80
%10 = load x86_fp80, x86_fp80* %3
%11 = fadd x86_fp80 %9, %10
store x86_fp80 %11, x86_fp80* %4
%12 = load double, double* %2
%13 = fpext double %12 to x86_fp80
%14 = load x86_fp80, x86_fp80* %3
%15 = fsub x86_fp80 %13, %14
store x86_fp80 %15, x86_fp80* %5
%16 = load double, double* %2
%17 = fpext double %16 to x86_fp80
%18 = load x86_fp80, x86_fp80* %3
%19 = fmul x86_fp80 %17, %18
store x86_fp80 %19, x86_fp80* %6
%20 = load double, double* %2
%21 = fpext double %20 to x86_fp80
%22 = load x86_fp80, x86_fp80* %3
%23 = fdiv x86_fp80 %21, %22
store x86_fp80 %23, x86_fp80* %7
%24 = load double, double* %2
%25 = load x86_fp80, x86_fp80* %3
%26 = load x86_fp80, x86_fp80* %4
%27 = load x86_fp80, x86_fp80* %5
%28 = load x86_fp80, x86_fp80* %6
%29 = load x86_fp80, x86_fp80* %7
%30 = call i32 @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str, i64 0, i64 0), double %24, x86_fp80 %25, x86_fp80 %26, x86_fp80 %27, x86_fp80 %28, x86_fp80 %29)
ret i32 %30
}

LLVM IR (-O2):
@.str = [31 x i8] c"(%f, %Lf), %Lf, %Lf, %Lf, %Lf\0A\00"
define i32 @main() {
%1 = tail call i32 @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str, i64 0, i64 0), double -1.530000e+01, x86_fp80 0xK4003B400000000000000, x86_fp80 0xK4001E666666666666000, x86_fp80 0xKC0049733333333333400, x86_fp80 0xKC007AC20000000000240, x86_fp80 0xKBFFEAE147AE147AE16C1)
ret i32 %1
}