float wallthicknss(zdepth, wallstreet)
float zdepth, wallstreet[];
{
  if (wallstreet[0] == 0.0)
    return (0.0);
  if (zdepth <= wallstreet[1] || zdepth >= wallstreet[3])
    return (0.0);
  if (zdepth < wallstreet[2]) {
    return (wallstreet[0] * sqrt(1. - pow((zdepth - wallstreet[2]) /
                                              (wallstreet[1] - wallstreet[2]),
                                          2.0)));
  } else {
    return (wallstreet[0] * sqrt(1. - pow((zdepth - wallstreet[2]) /
                                              (wallstreet[3] - wallstreet[2]),
                                          2.0)));
  }
}


x86 assembly (clang, -O0):
<wallthicknss>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1161 <wallthicknss+0x41>
jp     1161 <wallthicknss+0x41>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1292 <wallthicknss+0x172>
movss  -0x8(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
ucomiss %xmm1,%xmm0
jae    118b <wallthicknss+0x6b>
movss  -0x8(%rbp),%xmm0
mov    -0x10(%rbp),%rax
ucomiss 0xc(%rax),%xmm0
jb     1198 <wallthicknss+0x78>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1292 <wallthicknss+0x172>
movss  -0x8(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    1223 <wallthicknss+0x103>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movss  -0x8(%rbp),%xmm0
mov    -0x10(%rbp),%rax
subss  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm1
mov    -0x10(%rbp),%rax
subss  0x8(%rax),%xmm1
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe18(%rip),%xmm1
call   1030 <pow@plt>
movaps %xmm0,%xmm1
movsd  0xe00(%rip),%xmm0
subsd  %xmm1,%xmm0
call   1040 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  -0x18(%rbp),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1292 <wallthicknss+0x172>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movss  -0x8(%rbp),%xmm0
mov    -0x10(%rbp),%rax
subss  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  0xc(%rax),%xmm1
mov    -0x10(%rbp),%rax
subss  0x8(%rax),%xmm1
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xda4(%rip),%xmm1
call   1030 <pow@plt>
movaps %xmm0,%xmm1
movsd  0xd8c(%rip),%xmm0
subsd  %xmm1,%xmm0
call   1040 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  -0x20(%rbp),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<wallthicknss>:
push   %rax
movaps %xmm0,%xmm1
movss  (%rdi),%xmm2
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm2
jne    1124 <wallthicknss+0x14>
jp     1124 <wallthicknss+0x14>
pop    %rax
ret
cvtsd2ss %xmm1,%xmm1
movss  0x4(%rdi),%xmm3
ucomiss %xmm1,%xmm3
jae    1122 <wallthicknss+0x12>
movss  0xc(%rdi),%xmm4
ucomiss %xmm4,%xmm1
jae    1122 <wallthicknss+0x12>
movss  0x8(%rdi),%xmm0
ucomiss %xmm1,%xmm0
subss  %xmm0,%xmm1
jbe    1154 <wallthicknss+0x44>
subss  %xmm0,%xmm3
divss  %xmm3,%xmm1
jmp    115c <wallthicknss+0x4c>
subss  %xmm0,%xmm4
divss  %xmm4,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm1
cvtss2sd %xmm2,%xmm2
movsd  0xe90(%rip),%xmm0
subsd  %xmm1,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1184 <wallthicknss+0x74>
sqrtsd %xmm0,%xmm0
jmp    1193 <wallthicknss+0x83>
movsd  %xmm2,(%rsp)
call   1030 <sqrt@plt>
movsd  (%rsp),%xmm2
mulsd  %xmm2,%xmm0
cvtsd2ss %xmm0,%xmm0
pop    %rax
ret

LLVM IR (-O0):
define float @wallthicknss(double %0, float* %1) {
%3 = alloca float
%4 = alloca float
%5 = alloca float*
%6 = fptrunc double %0 to float
store float %6, float* %4
store float* %1, float** %5
%7 = load float*, float** %5
%8 = getelementptr inbounds float, float* %7, i64 0
%9 = load float, float* %8
%10 = fpext float %9 to double
%11 = fcmp oeq double %10, 0.000000e+00
br i1 %11, label %12, label %13
12: ; preds = %2
store float 0.000000e+00, float* %3
br label %80
13: ; preds = %2
%14 = load float, float* %4
%15 = load float*, float** %5
%16 = getelementptr inbounds float, float* %15, i64 1
%17 = load float, float* %16
%18 = fcmp ole float %14, %17
br i1 %18, label %25, label %19
19: ; preds = %13
%20 = load float, float* %4
%21 = load float*, float** %5
%22 = getelementptr inbounds float, float* %21, i64 3
%23 = load float, float* %22
%24 = fcmp oge float %20, %23
br i1 %24, label %25, label %26
25: ; preds = %19, %13
store float 0.000000e+00, float* %3
br label %80
26: ; preds = %19
%27 = load float, float* %4
%28 = load float*, float** %5
%29 = getelementptr inbounds float, float* %28, i64 2
%30 = load float, float* %29
%31 = fcmp olt float %27, %30
br i1 %31, label %32, label %56
32: ; preds = %26
%33 = load float*, float** %5
%34 = getelementptr inbounds float, float* %33, i64 0
%35 = load float, float* %34
%36 = fpext float %35 to double
%37 = load float, float* %4
%38 = load float*, float** %5
%39 = getelementptr inbounds float, float* %38, i64 2
%40 = load float, float* %39
%41 = fsub float %37, %40
%42 = load float*, float** %5
%43 = getelementptr inbounds float, float* %42, i64 1
%44 = load float, float* %43
%45 = load float*, float** %5
%46 = getelementptr inbounds float, float* %45, i64 2
%47 = load float, float* %46
%48 = fsub float %44, %47
%49 = fdiv float %41, %48
%50 = fpext float %49 to double
%51 = call double @pow(double %50, double 2.000000e+00)
%52 = fsub double 1.000000e+00, %51
%53 = call double @sqrt(double %52)
%54 = fmul double %36, %53
%55 = fptrunc double %54 to float
store float %55, float* %3
br label %80
56: ; preds = %26
%57 = load float*, float** %5
%58 = getelementptr inbounds float, float* %57, i64 0
%59 = load float, float* %58
%60 = fpext float %59 to double
%61 = load float, float* %4
%62 = load float*, float** %5
%63 = getelementptr inbounds float, float* %62, i64 2
%64 = load float, float* %63
%65 = fsub float %61, %64
%66 = load float*, float** %5
%67 = getelementptr inbounds float, float* %66, i64 3
%68 = load float, float* %67
%69 = load float*, float** %5
%70 = getelementptr inbounds float, float* %69, i64 2
%71 = load float, float* %70
%72 = fsub float %68, %71
%73 = fdiv float %65, %72
%74 = fpext float %73 to double
%75 = call double @pow(double %74, double 2.000000e+00)
%76 = fsub double 1.000000e+00, %75
%77 = call double @sqrt(double %76)
%78 = fmul double %60, %77
%79 = fptrunc double %78 to float
store float %79, float* %3
br label %80
80: ; preds = %56, %32, %25, %12
%81 = load float, float* %3
ret float %81
}

LLVM IR (-O2):
define float @wallthicknss(double %0, float* nocapture %1) {
%3 = fptrunc double %0 to float
%4 = load float, float* %1
%5 = fpext float %4 to double
%6 = fcmp oeq float %4, 0.000000e+00
br i1 %6, label %36, label %7
7: ; preds = %2
%8 = getelementptr inbounds float, float* %1, i64 1
%9 = load float, float* %8
%10 = fcmp ult float %9, %3
br i1 %10, label %11, label %36
11: ; preds = %7
%12 = getelementptr inbounds float, float* %1, i64 3
%13 = load float, float* %12
%14 = fcmp ugt float %13, %3
br i1 %14, label %15, label %36
15: ; preds = %11
%16 = getelementptr inbounds float, float* %1, i64 2
%17 = load float, float* %16
%18 = fcmp ogt float %17, %3
%19 = fsub float %3, %17
br i1 %18, label %20, label %25
20: ; preds = %15
%21 = fsub float %9, %17
%22 = fdiv float %19, %21
%23 = fpext float %22 to double
%24 = fmul double %23, %23
br label %30
25: ; preds = %15
%26 = fsub float %13, %17
%27 = fdiv float %19, %26
%28 = fpext float %27 to double
%29 = fmul double %28, %28
br label %30
30: ; preds = %20, %25
%31 = phi double [ %29, %25 ], [ %24, %20 ]
%32 = fsub double 1.000000e+00, %31
%33 = tail call double @sqrt(double %32)
%34 = fmul double %33, %5
%35 = fptrunc double %34 to float
br label %36
36: ; preds = %30, %7, %11, %2
%37 = phi float [ 0.000000e+00, %2 ], [ 0.000000e+00, %11 ], [ 0.000000e+00, %7 ], [ %35, %30 ]
ret float %37
}