#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*/ putchar(char);
int main() {
  for (float y = 1.5; y > -1.5; y -= 0.1) {
    for (float x = -1.5; x < 1.5; x += 0.05) {
      float a = x * x + y * y - 1;
      a *a *a - x *x *y *y *y <= 0.0 ? putchar('*') : putchar(' ');
    }
    putchar('\n');
  }
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movl   $0x0,-0x4(%rbp)
movss  0xed9(%rip),%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xed3(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1253 <main+0x143>
movss  0xeb5(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xeb3(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1226 <main+0x116>
movss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xe75(%rip),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
mulss  -0x10(%rbp),%xmm0
movss  -0x10(%rbp),%xmm2
movss  -0xc(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jb     11f9 <main+0xe9>
mov    $0x2a,%edi
call   1030 <putchar@plt>
jmp    1203 <main+0xf3>
mov    $0x20,%edi
call   1030 <putchar@plt>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe14(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    1154 <main+0x44>
mov    $0xa,%edi
call   1030 <putchar@plt>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xddf(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    112c <main+0x1c>
xor    %eax,%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
sub    $0x18,%rsp
movss  0xee4(%rip),%xmm3
movsd  0xeec(%rip),%xmm1
movss  0xed8(%rip),%xmm2
jmp    1167 <main+0x57>
xchg   %ax,%ax
mov    $0xa,%edi
call   1030 <putchar@plt>
movsd  0x8(%rsp),%xmm0
addsd  0xee0(%rip),%xmm0
xorps  %xmm3,%xmm3
cvtsd2ss %xmm0,%xmm3
xorps  %xmm1,%xmm1
cvtss2sd %xmm3,%xmm1
movss  0xea6(%rip),%xmm2
ucomiss %xmm2,%xmm3
jbe    120e <main+0xfe>
movsd  %xmm1,0x8(%rsp)
movaps %xmm3,%xmm0
mulss  %xmm3,%xmm0
movss  %xmm0,(%rsp)
movsd  0xe97(%rip),%xmm4
movaps %xmm2,%xmm0
movss  %xmm3,0x4(%rsp)
jmp    11c5 <main+0xb5>
nopl   0x0(%rax)
call   1030 <putchar@plt>
movsd  0x10(%rsp),%xmm0
addsd  0xe7d(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
xorps  %xmm4,%xmm4
cvtss2sd %xmm0,%xmm4
movss  0xe4a(%rip),%xmm1
ucomiss %xmm0,%xmm1
movss  0x4(%rsp),%xmm3
jbe    1130 <main+0x20>
movsd  %xmm4,0x10(%rsp)
mulss  %xmm0,%xmm0
movaps %xmm3,%xmm1
mulss  %xmm0,%xmm1
addss  (%rsp),%xmm0
addss  0xe25(%rip),%xmm0
movaps %xmm0,%xmm2
mulss  %xmm0,%xmm2
mulss  %xmm3,%xmm1
mulss  %xmm3,%xmm1
mulss  %xmm0,%xmm2
subss  %xmm1,%xmm2
xorps  %xmm0,%xmm0
ucomiss %xmm2,%xmm0
mov    $0x20,%edi
jb     1190 <main+0x80>
mov    $0x2a,%edi
jmp    1190 <main+0x80>
xor    %eax,%eax
add    $0x18,%rsp
ret

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca float
%3 = alloca float
%4 = alloca float
store i32 0, i32* %1
store float 1.500000e+00, float* %2
br label %5
5: ; preds = %52, %0
%6 = load float, float* %2
%7 = fpext float %6 to double
%8 = fcmp ogt double %7, -1.500000e+00
br i1 %8, label %9, label %57
9: ; preds = %5
store float -1.500000e+00, float* %3
br label %10
10: ; preds = %45, %9
%11 = load float, float* %3
%12 = fpext float %11 to double
%13 = fcmp olt double %12, 1.500000e+00
br i1 %13, label %14, label %50
14: ; preds = %10
%15 = load float, float* %3
%16 = load float, float* %3
%17 = load float, float* %2
%18 = load float, float* %2
%19 = fmul float %17, %18
%20 = call float @llvm.fmuladd.f32(float %15, float %16, float %19)
%21 = fsub float %20, 1.000000e+00
store float %21, float* %4
%22 = load float, float* %4
%23 = load float, float* %4
%24 = fmul float %22, %23
%25 = load float, float* %4
%26 = load float, float* %3
%27 = load float, float* %3
%28 = fmul float %26, %27
%29 = load float, float* %2
%30 = fmul float %28, %29
%31 = load float, float* %2
%32 = fmul float %30, %31
%33 = load float, float* %2
%34 = fmul float %32, %33
%35 = fneg float %34
%36 = call float @llvm.fmuladd.f32(float %24, float %25, float %35)
%37 = fpext float %36 to double
%38 = fcmp ole double %37, 0.000000e+00
br i1 %38, label %39, label %41
39: ; preds = %14
%40 = call i32 @putchar(i8 signext 42)
br label %43
41: ; preds = %14
%42 = call i32 @putchar(i8 signext 32)
br label %43
43: ; preds = %41, %39
%44 = phi i32 [ %40, %39 ], [ %42, %41 ]
br label %45
45: ; preds = %43
%46 = load float, float* %3
%47 = fpext float %46 to double
%48 = fadd double %47, 5.000000e-02
%49 = fptrunc double %48 to float
store float %49, float* %3
br label %10
50: ; preds = %10
%51 = call i32 @putchar(i8 signext 10)
br label %52
52: ; preds = %50
%53 = load float, float* %2
%54 = fpext float %53 to double
%55 = fsub double %54, 1.000000e-01
%56 = fptrunc double %55 to float
store float %56, float* %2
br label %5
57: ; preds = %5
ret i32 0
}

LLVM IR (-O2):
define i32 @main() {
br label %1
1: ; preds = %0, %6
%2 = phi double [ 1.500000e+00, %0 ], [ %10, %6 ]
%3 = phi float [ 1.500000e+00, %0 ], [ %9, %6 ]
%4 = fmul float %3, %3
br label %12
5: ; preds = %6
ret i32 0
6: ; preds = %12
%7 = tail call i32 @putchar(i8 signext 10)
%8 = fadd double %2, -1.000000e-01
%9 = fptrunc double %8 to float
%10 = fpext float %9 to double
%11 = fcmp ogt float %9, -1.500000e+00
br i1 %11, label %1, label %5
12: ; preds = %1, %12
%13 = phi double [ -1.500000e+00, %1 ], [ %29, %12 ]
%14 = phi float [ -1.500000e+00, %1 ], [ %28, %12 ]
%15 = tail call float @llvm.fmuladd.f32(float %14, float %14, float %4)
%16 = fadd float %15, -1.000000e+00
%17 = fmul float %16, %16
%18 = fneg float %14
%19 = fmul float %14, %18
%20 = fmul float %3, %19
%21 = fmul float %3, %20
%22 = fmul float %3, %21
%23 = tail call float @llvm.fmuladd.f32(float %17, float %16, float %22)
%24 = fcmp ugt float %23, 0.000000e+00
%25 = select i1 %24, i8 32, i8 42
%26 = tail call i32 @putchar(i8 signext %25)
%27 = fadd double %13, 5.000000e-02
%28 = fptrunc double %27 to float
%29 = fpext float %28 to double
%30 = fcmp olt float %28, 1.500000e+00
br i1 %30, label %12, label %6
}