#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*/ EDOM;
long double INFINITY;
long double NAN;
long double __sqrt_approx(long double);
int /*<<< orphan*/ errno;
scalar_t__ isinf(long double);
scalar_t__ isnan(long double);
long double sqrtl(long double x) {
  long double y, y1;
  if (x < 0.0) {
    errno = EDOM;
    return NAN;
  }
  if (isnan(x))
    return NAN;
  if (isinf(x))
    return INFINITY;
  if (x == 0.0)
    return 0.0;
  y = __sqrt_approx(x);
  y = 0.5 * (y + x / y);
  y = 0.5 * (y + x / y);
  y = 0.5 * (y + x / y);
  y = 0.5 * (y + x / y);
  if (y * y < x - 1.0 || y * y > x + 1.0) {
    y1 = -1.0;
    while (y != y1) {
      y1 = y;
      y = 0.5 * (y + x / y);
    }
  }
  return y;
}


x86 assembly (clang, -O0):
<sqrtl>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
fldt   0x10(%rbp)
fstpt  -0x20(%rbp)
fldt   -0x20(%rbp)
fldz
fucomip %st(1),%st
fstp   %st(0)
jbe    1175 <sqrtl+0x45>
jmp    1152 <sqrtl+0x22>
mov    0x2e7f(%rip),%rax
mov    (%rax),%ecx
mov    0x2e66(%rip),%rax
mov    %ecx,(%rax)
mov    0x2e8d(%rip),%rax
fldt   (%rax)
fstpt  -0x10(%rbp)
jmp    12c8 <sqrtl+0x198>
fldt   -0x20(%rbp)
mov    %rsp,%rax
fstpt  (%rax)
call   1040 <isnan@plt>
cmp    $0x0,%rax
je     119d <sqrtl+0x6d>
mov    0x2e65(%rip),%rax
fldt   (%rax)
fstpt  -0x10(%rbp)
jmp    12c8 <sqrtl+0x198>
fldt   -0x20(%rbp)
mov    %rsp,%rax
fstpt  (%rax)
call   1050 <isinf@plt>
cmp    $0x0,%rax
je     11c5 <sqrtl+0x95>
mov    0x2e25(%rip),%rax
fldt   (%rax)
fstpt  -0x10(%rbp)
jmp    12c8 <sqrtl+0x198>
fldt   -0x20(%rbp)
fldz
fxch   %st(1)
fucomip %st(1),%st
fstp   %st(0)
jne    11eb <sqrtl+0xbb>
jp     11eb <sqrtl+0xbb>
jmp    11e1 <sqrtl+0xb1>
fldz
fstpt  -0x10(%rbp)
jmp    12c8 <sqrtl+0x198>
fldt   -0x20(%rbp)
mov    %rsp,%rax
fstpt  (%rax)
call   1030 <__sqrt_approx@plt>
fstpt  -0x30(%rbp)
fldt   -0x30(%rbp)
fldt   -0x20(%rbp)
fdiv   %st(1),%st
faddp  %st,%st(1)
flds   0xdf5(%rip)
fmul   %st,%st(1)
fxch   %st(1)
fstpt  -0x30(%rbp)
fldt   -0x30(%rbp)
fldt   -0x20(%rbp)
fdiv   %st(1),%st
faddp  %st,%st(1)
fmul   %st(1),%st
fstpt  -0x30(%rbp)
fldt   -0x30(%rbp)
fldt   -0x20(%rbp)
fdiv   %st(1),%st
faddp  %st,%st(1)
fmul   %st(1),%st
fstpt  -0x30(%rbp)
fldt   -0x30(%rbp)
fldt   -0x20(%rbp)
fdiv   %st(1),%st
faddp  %st,%st(1)
fmulp  %st,%st(1)
fstpt  -0x30(%rbp)
fldt   -0x30(%rbp)
fmul   %st,%st(0)
fldt   -0x20(%rbp)
fld1
fchs
faddp  %st,%st(1)
fucomip %st(1),%st
fstp   %st(0)
ja     1279 <sqrtl+0x149>
jmp    125c <sqrtl+0x12c>
fldt   -0x30(%rbp)
fmul   %st,%st(0)
fldt   -0x20(%rbp)
fld1
faddp  %st,%st(1)
fxch   %st(1)
fucomip %st(1),%st
fstp   %st(0)
jbe    12c2 <sqrtl+0x192>
jmp    1279 <sqrtl+0x149>
fld1
fchs
fstpt  -0x40(%rbp)
fldt   -0x30(%rbp)
fldt   -0x40(%rbp)
fxch   %st(1)
fucomip %st(1),%st
fstp   %st(0)
jne    129d <sqrtl+0x16d>
jp     129d <sqrtl+0x16d>
jmp    12bd <sqrtl+0x18d>
fldt   -0x30(%rbp)
fstpt  -0x40(%rbp)
fldt   -0x30(%rbp)
fldt   -0x20(%rbp)
fdiv   %st(1),%st
faddp  %st,%st(1)
flds   0xd4d(%rip)
fmulp  %st,%st(1)
fstpt  -0x30(%rbp)
jmp    1280 <sqrtl+0x150>
jmp    12c2 <sqrtl+0x192>
fldt   -0x30(%rbp)
fstpt  -0x10(%rbp)
fldt   -0x10(%rbp)
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sqrtl>:
sub    $0x28,%rsp
fldt   0x30(%rsp)
fldz
fucomi %st(1),%st
jbe    1156 <sqrtl+0x26>
fstp   %st(1)
fstp   %st(0)
mov    0x2e8f(%rip),%rax
mov    (%rax),%eax
mov    0x2e76(%rip),%rcx
mov    %eax,(%rcx)
jmp    116d <sqrtl+0x3d>
fstpt  0x1c(%rsp)
fld    %st(0)
fstpt  (%rsp)
fstpt  0x10(%rsp)
call   1040 <isnan@plt>
test   %rax,%rax
je     1183 <sqrtl+0x53>
mov    0x2e84(%rip),%rax
fldt   (%rax)
fldz
fldz
fstp   %st(1)
fstp   %st(0)
add    $0x28,%rsp
ret
fldt   0x10(%rsp)
fstpt  (%rsp)
call   1050 <isinf@plt>
test   %rax,%rax
je     119d <sqrtl+0x6d>
mov    0x2e45(%rip),%rax
jmp    1174 <sqrtl+0x44>
fldt   0x1c(%rsp)
fldt   0x10(%rsp)
fucomi %st(1),%st
fldz
jne    11ad <sqrtl+0x7d>
jnp    117a <sqrtl+0x4a>
fstp   %st(2)
fstp   %st(1)
fstpt  (%rsp)
call   1030 <__sqrt_approx@plt>
fldt   0x10(%rsp)
fdiv   %st(1),%st
faddp  %st,%st(1)
flds   0xe39(%rip)
fmul   %st,%st(1)
fldt   0x10(%rsp)
fdiv   %st(2),%st
faddp  %st,%st(2)
fmul   %st,%st(1)
fldt   0x10(%rsp)
fdiv   %st(2),%st
faddp  %st,%st(2)
fmul   %st,%st(1)
fldt   0x10(%rsp)
fdiv   %st(2),%st
faddp  %st,%st(2)
fmulp  %st,%st(1)
fld    %st(0)
fmul   %st(1),%st
fld1
fld    %st(0)
fchs
fldt   0x10(%rsp)
fadd   %st(1),%st
fucomip %st(3),%st
fldt   0x10(%rsp)
setbe  %al
fadd   %st,%st(2)
fxch   %st(3)
fucomip %st(2),%st
fstp   %st(1)
setbe  %cl
test   %cl,%al
jne    1241 <sqrtl+0x111>
fxch   %st(2)
fucomi %st(2),%st
fstp   %st(2)
jne    1219 <sqrtl+0xe9>
jnp    1243 <sqrtl+0x113>
fldz
fxch   %st(2)
fxch   %st(1)
nop
fstp   %st(2)
fld    %st(1)
fdiv   %st(1),%st
fadd   %st(1),%st
fmuls  0xdd2(%rip)
fucomi %st(1),%st
fstp   %st(1)
fld    %st(0)
fxch   %st(1)
fxch   %st(2)
jne    1220 <sqrtl+0xf0>
jp     1220 <sqrtl+0xf0>
jmp    117a <sqrtl+0x4a>
fstp   %st(0)
fstp   %st(0)
jmp    1176 <sqrtl+0x46>

LLVM IR (-O0):
@EDOM = global i32 0
@errno = global i32 0
@NAN = global x86_fp80 0xK00000000000000000000
@INFINITY = global x86_fp80 0xK00000000000000000000
define x86_fp80 @sqrtl(x86_fp80 %0) {
%2 = alloca x86_fp80
%3 = alloca x86_fp80
%4 = alloca x86_fp80
%5 = alloca x86_fp80
store x86_fp80 %0, x86_fp80* %3
%6 = load x86_fp80, x86_fp80* %3
%7 = fcmp olt x86_fp80 %6, 0xK00000000000000000000
br i1 %7, label %8, label %11
8: ; preds = %1
%9 = load i32, i32* @EDOM
store i32 %9, i32* @errno
%10 = load x86_fp80, x86_fp80* @NAN
store x86_fp80 %10, x86_fp80* %2
br label %83
11: ; preds = %1
%12 = load x86_fp80, x86_fp80* %3
%13 = call i64 @isnan(x86_fp80 %12)
%14 = icmp ne i64 %13, 0
br i1 %14, label %15, label %17
15: ; preds = %11
%16 = load x86_fp80, x86_fp80* @NAN
store x86_fp80 %16, x86_fp80* %2
br label %83
17: ; preds = %11
%18 = load x86_fp80, x86_fp80* %3
%19 = call i64 @isinf(x86_fp80 %18)
%20 = icmp ne i64 %19, 0
br i1 %20, label %21, label %23
21: ; preds = %17
%22 = load x86_fp80, x86_fp80* @INFINITY
store x86_fp80 %22, x86_fp80* %2
br label %83
23: ; preds = %17
%24 = load x86_fp80, x86_fp80* %3
%25 = fcmp oeq x86_fp80 %24, 0xK00000000000000000000
br i1 %25, label %26, label %27
26: ; preds = %23
store x86_fp80 0xK00000000000000000000, x86_fp80* %2
br label %83
27: ; preds = %23
%28 = load x86_fp80, x86_fp80* %3
%29 = call x86_fp80 @__sqrt_approx(x86_fp80 %28)
store x86_fp80 %29, x86_fp80* %4
%30 = load x86_fp80, x86_fp80* %4
%31 = load x86_fp80, x86_fp80* %3
%32 = load x86_fp80, x86_fp80* %4
%33 = fdiv x86_fp80 %31, %32
%34 = fadd x86_fp80 %30, %33
%35 = fmul x86_fp80 0xK3FFE8000000000000000, %34
store x86_fp80 %35, x86_fp80* %4
%36 = load x86_fp80, x86_fp80* %4
%37 = load x86_fp80, x86_fp80* %3
%38 = load x86_fp80, x86_fp80* %4
%39 = fdiv x86_fp80 %37, %38
%40 = fadd x86_fp80 %36, %39
%41 = fmul x86_fp80 0xK3FFE8000000000000000, %40
store x86_fp80 %41, x86_fp80* %4
%42 = load x86_fp80, x86_fp80* %4
%43 = load x86_fp80, x86_fp80* %3
%44 = load x86_fp80, x86_fp80* %4
%45 = fdiv x86_fp80 %43, %44
%46 = fadd x86_fp80 %42, %45
%47 = fmul x86_fp80 0xK3FFE8000000000000000, %46
store x86_fp80 %47, x86_fp80* %4
%48 = load x86_fp80, x86_fp80* %4
%49 = load x86_fp80, x86_fp80* %3
%50 = load x86_fp80, x86_fp80* %4
%51 = fdiv x86_fp80 %49, %50
%52 = fadd x86_fp80 %48, %51
%53 = fmul x86_fp80 0xK3FFE8000000000000000, %52
store x86_fp80 %53, x86_fp80* %4
%54 = load x86_fp80, x86_fp80* %4
%55 = load x86_fp80, x86_fp80* %4
%56 = fmul x86_fp80 %54, %55
%57 = load x86_fp80, x86_fp80* %3
%58 = fsub x86_fp80 %57, 0xK3FFF8000000000000000
%59 = fcmp olt x86_fp80 %56, %58
br i1 %59, label %67, label %60
60: ; preds = %27
%61 = load x86_fp80, x86_fp80* %4
%62 = load x86_fp80, x86_fp80* %4
%63 = fmul x86_fp80 %61, %62
%64 = load x86_fp80, x86_fp80* %3
%65 = fadd x86_fp80 %64, 0xK3FFF8000000000000000
%66 = fcmp ogt x86_fp80 %63, %65
br i1 %66, label %67, label %81
67: ; preds = %60, %27
store x86_fp80 0xKBFFF8000000000000000, x86_fp80* %5
br label %68
68: ; preds = %72, %67
%69 = load x86_fp80, x86_fp80* %4
%70 = load x86_fp80, x86_fp80* %5
%71 = fcmp une x86_fp80 %69, %70
br i1 %71, label %72, label %80
72: ; preds = %68
%73 = load x86_fp80, x86_fp80* %4
store x86_fp80 %73, x86_fp80* %5
%74 = load x86_fp80, x86_fp80* %4
%75 = load x86_fp80, x86_fp80* %3
%76 = load x86_fp80, x86_fp80* %4
%77 = fdiv x86_fp80 %75, %76
%78 = fadd x86_fp80 %74, %77
%79 = fmul x86_fp80 0xK3FFE8000000000000000, %78
store x86_fp80 %79, x86_fp80* %4
br label %68
80: ; preds = %68
br label %81
81: ; preds = %80, %60
%82 = load x86_fp80, x86_fp80* %4
store x86_fp80 %82, x86_fp80* %2
br label %83
83: ; preds = %81, %26, %21, %15, %8
%84 = load x86_fp80, x86_fp80* %2
ret x86_fp80 %84
}

LLVM IR (-O2):
@EDOM = global i32 0
@errno = global i32 0
@NAN = global x86_fp80 0xK00000000000000000000
@INFINITY = global x86_fp80 0xK00000000000000000000
define x86_fp80 @sqrtl(x86_fp80 %0) {
%2 = fcmp olt x86_fp80 %0, 0xK00000000000000000000
br i1 %2, label %3, label %6
3: ; preds = %1
%4 = load i32, i32* @EDOM
store i32 %4, i32* @errno
%5 = load x86_fp80, x86_fp80* @NAN
br label %46
6: ; preds = %1
%7 = tail call i64 @isnan(x86_fp80 %0)
%8 = icmp eq i64 %7, 0
br i1 %8, label %11, label %9
9: ; preds = %6
%10 = load x86_fp80, x86_fp80* @NAN
br label %46
11: ; preds = %6
%12 = tail call i64 @isinf(x86_fp80 %0)
%13 = icmp eq i64 %12, 0
br i1 %13, label %16, label %14
14: ; preds = %11
%15 = load x86_fp80, x86_fp80* @INFINITY
br label %46
16: ; preds = %11
%17 = fcmp oeq x86_fp80 %0, 0xK00000000000000000000
br i1 %17, label %46, label %18
18: ; preds = %16
%19 = tail call x86_fp80 @__sqrt_approx(x86_fp80 %0)
%20 = fdiv x86_fp80 %0, %19
%21 = fadd x86_fp80 %19, %20
%22 = fmul x86_fp80 %21, 0xK3FFE8000000000000000
%23 = fdiv x86_fp80 %0, %22
%24 = fadd x86_fp80 %22, %23
%25 = fmul x86_fp80 %24, 0xK3FFE8000000000000000
%26 = fdiv x86_fp80 %0, %25
%27 = fadd x86_fp80 %25, %26
%28 = fmul x86_fp80 %27, 0xK3FFE8000000000000000
%29 = fdiv x86_fp80 %0, %28
%30 = fadd x86_fp80 %28, %29
%31 = fmul x86_fp80 %30, 0xK3FFE8000000000000000
%32 = fmul x86_fp80 %31, %31
%33 = fadd x86_fp80 %0, 0xKBFFF8000000000000000
%34 = fcmp olt x86_fp80 %32, %33
%35 = fadd x86_fp80 %0, 0xK3FFF8000000000000000
%36 = fcmp ogt x86_fp80 %32, %35
%37 = or i1 %34, %36
%38 = fcmp une x86_fp80 %31, 0xKBFFF8000000000000000
%39 = select i1 %37, i1 %38, i1 false
br i1 %39, label %40, label %46
40: ; preds = %18, %40
%41 = phi x86_fp80 [ %44, %40 ], [ %31, %18 ]
%42 = fdiv x86_fp80 %0, %41
%43 = fadd x86_fp80 %41, %42
%44 = fmul x86_fp80 %43, 0xK3FFE8000000000000000
%45 = fcmp une x86_fp80 %44, %41
br i1 %45, label %40, label %46
46: ; preds = %40, %18, %16, %14, %9, %3
%47 = phi x86_fp80 [ %5, %3 ], [ %10, %9 ], [ %15, %14 ], [ 0xK00000000000000000000, %16 ], [ %31, %18 ], [ %44, %40 ]
ret x86_fp80 %47
}