int prem_find_layer_x(double r, double r_unit, double *rb, int n, int np,
                      double *x) {
  int i, ilayer, nm1;
  ilayer = 0;
  nm1 = n - 1;
  while ((rb[ilayer] < r) && (ilayer < nm1))
    ilayer++;
  x[0] = 1.0;
  x[1] = r / r_unit;
  for (i = 2; i < np; i++)
    x[i] = x[i - 1] * x[1];
  return ilayer;
}


x86 assembly (clang, -O0):
<prem_find_layer_x>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %esi,-0x1c(%rbp)
mov    %edx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x8(%rbp),%xmm0
xor    %eax,%eax
ucomisd %xmm1,%xmm0
mov    %al,-0x35(%rbp)
jbe    1159 <prem_find_layer_x+0x59>
mov    -0x30(%rbp),%eax
cmp    -0x34(%rbp),%eax
setl   %al
mov    %al,-0x35(%rbp)
mov    -0x35(%rbp),%al
test   $0x1,%al
jne    1169 <prem_find_layer_x+0x69>
jmp    1177 <prem_find_layer_x+0x77>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    112c <prem_find_layer_x+0x2c>
mov    -0x28(%rbp),%rax
movsd  0xe7d(%rip),%xmm0
movsd  %xmm0,(%rax)
movsd  -0x8(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11e3 <prem_find_layer_x+0xe3>
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mulsd  0x8(%rax),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11a1 <prem_find_layer_x+0xa1>
mov    -0x30(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<prem_find_layer_x>:
add    $0xffffffff,%esi
movslq %esi,%r8
xor    %esi,%esi
nopl   0x0(%rax,%rax,1)
lea    0x1(%rsi),%rax
ucomisd (%rdi,%rsi,8),%xmm0
jbe    1123 <prem_find_layer_x+0x23>
cmp    %r8,%rsi
mov    %rax,%rsi
jl     1110 <prem_find_layer_x+0x10>
movabs $0x3ff0000000000000,%rsi
mov    %rsi,(%rcx)
divsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rcx)
cmp    $0x3,%edx
jl     11e3 <prem_find_layer_x+0xe3>
mulsd  %xmm0,%xmm0
movsd  %xmm0,0x10(%rcx)
je     11e3 <prem_find_layer_x+0xe3>
mov    %edx,%r8d
lea    -0x3(%r8),%rsi
add    $0xfffffffffffffffc,%r8
mov    %esi,%r9d
and    $0x3,%r9d
mov    $0x3,%edi
cmp    $0x3,%r8
jb     11c0 <prem_find_layer_x+0xc0>
and    $0xfffffffffffffffc,%rsi
neg    %rsi
mov    $0x3,%edi
nopw   0x0(%rax,%rax,1)
mulsd  0x8(%rcx),%xmm0
movsd  %xmm0,(%rcx,%rdi,8)
movsd  0x8(%rcx),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rcx,%rdi,8)
mulsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rcx,%rdi,8)
mulsd  0x8(%rcx),%xmm0
movsd  %xmm0,0x18(%rcx,%rdi,8)
lea    (%rsi,%rdi,1),%rdx
add    $0x4,%rdx
add    $0x4,%rdi
cmp    $0x3,%rdx
jne    1180 <prem_find_layer_x+0x80>
test   %r9,%r9
je     11e3 <prem_find_layer_x+0xe3>
lea    (%rcx,%rdi,8),%rsi
xor    %edi,%edi
nopl   0x0(%rax,%rax,1)
mulsd  0x8(%rcx),%xmm0
movsd  %xmm0,(%rsi,%rdi,8)
add    $0x1,%rdi
cmp    %rdi,%r9
jne    11d0 <prem_find_layer_x+0xd0>
add    $0xffffffff,%eax
ret

LLVM IR (-O0):
define i32 @prem_find_layer_x(double %0, double %1, double* %2, i32 %3, i32 %4, double* %5) {
%7 = alloca double
%8 = alloca double
%9 = alloca double*
%10 = alloca i32
%11 = alloca i32
%12 = alloca double*
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
store double %0, double* %7
store double %1, double* %8
store double* %2, double** %9
store i32 %3, i32* %10
store i32 %4, i32* %11
store double* %5, double** %12
store i32 0, i32* %14
%16 = load i32, i32* %10
%17 = sub nsw i32 %16, 1
store i32 %17, i32* %15
br label %18
18: ; preds = %32, %6
%19 = load double*, double** %9
%20 = load i32, i32* %14
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds double, double* %19, i64 %21
%23 = load double, double* %22
%24 = load double, double* %7
%25 = fcmp olt double %23, %24
br i1 %25, label %26, label %30
26: ; preds = %18
%27 = load i32, i32* %14
%28 = load i32, i32* %15
%29 = icmp slt i32 %27, %28
br label %30
30: ; preds = %26, %18
%31 = phi i1 [ false, %18 ], [ %29, %26 ]
br i1 %31, label %32, label %35
32: ; preds = %30
%33 = load i32, i32* %14
%34 = add nsw i32 %33, 1
store i32 %34, i32* %14
br label %18
35: ; preds = %30
%36 = load double*, double** %12
%37 = getelementptr inbounds double, double* %36, i64 0
store double 1.000000e+00, double* %37
%38 = load double, double* %7
%39 = load double, double* %8
%40 = fdiv double %38, %39
%41 = load double*, double** %12
%42 = getelementptr inbounds double, double* %41, i64 1
store double %40, double* %42
store i32 2, i32* %13
br label %43
43: ; preds = %62, %35
%44 = load i32, i32* %13
%45 = load i32, i32* %11
%46 = icmp slt i32 %44, %45
br i1 %46, label %47, label %65
47: ; preds = %43
%48 = load double*, double** %12
%49 = load i32, i32* %13
%50 = sub nsw i32 %49, 1
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds double, double* %48, i64 %51
%53 = load double, double* %52
%54 = load double*, double** %12
%55 = getelementptr inbounds double, double* %54, i64 1
%56 = load double, double* %55
%57 = fmul double %53, %56
%58 = load double*, double** %12
%59 = load i32, i32* %13
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds double, double* %58, i64 %60
store double %57, double* %61
br label %62
62: ; preds = %47
%63 = load i32, i32* %13
%64 = add nsw i32 %63, 1
store i32 %64, i32* %13
br label %43
65: ; preds = %43
%66 = load i32, i32* %14
ret i32 %66
}

LLVM IR (-O2):
define i32 @prem_find_layer_x(double %0, double %1, double* nocapture %2, i32 %3, i32 %4, double* nocapture %5) {
%7 = add nsw i32 %3, -1
%8 = sext i32 %7 to i64
br label %9
9: ; preds = %9, %6
%10 = phi i64 [ %16, %9 ], [ 0, %6 ]
%11 = getelementptr inbounds double, double* %2, i64 %10
%12 = load double, double* %11
%13 = fcmp olt double %12, %0
%14 = icmp slt i64 %10, %8
%15 = select i1 %13, i1 %14, i1 false
%16 = add nuw nsw i64 %10, 1
br i1 %15, label %9, label %17
17: ; preds = %9
store double 1.000000e+00, double* %5
%18 = fdiv double %0, %1
%19 = getelementptr inbounds double, double* %5, i64 1
store double %18, double* %19
%20 = icmp sgt i32 %4, 2
br i1 %20, label %21, label %68
21: ; preds = %17
%22 = zext i32 %4 to i64
%23 = fmul double %18, %18
%24 = getelementptr inbounds double, double* %5, i64 2
store double %23, double* %24
%25 = icmp eq i32 %4, 3
br i1 %25, label %68, label %26
26: ; preds = %21
%27 = add nsw i64 %22, -3
%28 = add nsw i64 %22, -4
%29 = and i64 %27, 3
%30 = icmp ult i64 %28, 3
br i1 %30, label %54, label %31
31: ; preds = %26
%32 = and i64 %27, -4
br label %33
33: ; preds = %33, %31
%34 = phi i64 [ 3, %31 ], [ %51, %33 ]
%35 = phi double [ %23, %31 ], [ %49, %33 ]
%36 = phi i64 [ 0, %31 ], [ %52, %33 ]
%37 = load double, double* %19
%38 = fmul double %35, %37
%39 = getelementptr inbounds double, double* %5, i64 %34
store double %38, double* %39
%40 = add nuw nsw i64 %34, 1
%41 = load double, double* %19
%42 = fmul double %38, %41
%43 = getelementptr inbounds double, double* %5, i64 %40
store double %42, double* %43
%44 = add nuw nsw i64 %34, 2
%45 = fmul double %42, %41
%46 = getelementptr inbounds double, double* %5, i64 %44
store double %45, double* %46
%47 = add nuw nsw i64 %34, 3
%48 = load double, double* %19
%49 = fmul double %45, %48
%50 = getelementptr inbounds double, double* %5, i64 %47
store double %49, double* %50
%51 = add nuw nsw i64 %34, 4
%52 = add i64 %36, 4
%53 = icmp eq i64 %52, %32
br i1 %53, label %54, label %33
54: ; preds = %33, %26
%55 = phi i64 [ 3, %26 ], [ %51, %33 ]
%56 = phi double [ %23, %26 ], [ %49, %33 ]
%57 = icmp eq i64 %29, 0
br i1 %57, label %68, label %58
58: ; preds = %54, %58
%59 = phi i64 [ %65, %58 ], [ %55, %54 ]
%60 = phi double [ %63, %58 ], [ %56, %54 ]
%61 = phi i64 [ %66, %58 ], [ 0, %54 ]
%62 = load double, double* %19
%63 = fmul double %60, %62
%64 = getelementptr inbounds double, double* %5, i64 %59
store double %63, double* %64
%65 = add nuw nsw i64 %59, 1
%66 = add i64 %61, 1
%67 = icmp eq i64 %66, %29
br i1 %67, label %68, label %58
68: ; preds = %54, %58, %21, %17
%69 = trunc i64 %10 to i32
ret i32 %69
}