int wavevelo(double restwav, int nwave, int swave, int svelo,
             const double wave[], double velo[], int stat[]) {
  double r, s;
  register int iwave, *statp;
  register const double *wavep;
  register double *velop;
  r = restwav * restwav;
  wavep = wave;
  velop = velo;
  statp = stat;
  for (iwave = 0; iwave < nwave; iwave++) {
    s = *wavep * *wavep;
    *velop = 2.99792458e8 * (s - r) / (s + r);
    *(statp++) = 0;
    wavep += swave;
    velop += svelo;
  }
  return 0;
}


x86 assembly (clang, -O0):
<wavevelo>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movsd  -0x8(%rbp),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11e6 <wavevelo+0xe6>
mov    -0x58(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mulsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
subsd  -0x38(%rbp),%xmm1
movsd  0xe81(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x40(%rbp),%xmm1
addsd  -0x38(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x60(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x50(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x50(%rbp)
movl   $0x0,(%rax)
mov    -0x10(%rbp),%ecx
mov    -0x58(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x60(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    114c <wavevelo+0x4c>
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<wavevelo>:
test   %edi,%edi
jle    11d5 <wavevelo+0xd5>
mulsd  %xmm0,%xmm0
cmp    $0x1,%edi
je     11a3 <wavevelo+0xa3>
movslq %esi,%r10
movslq %edx,%r11
mov    %edi,%esi
and    $0xfffffffe,%esi
mov    %r11,%rdx
shl    $0x4,%rdx
mov    %r10,%rax
shl    $0x4,%rax
movsd  0xeca(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
movsd  (%rcx),%xmm2
mulsd  %xmm2,%xmm2
movapd %xmm0,%xmm3
addsd  %xmm2,%xmm3
subsd  %xmm0,%xmm2
mulsd  %xmm1,%xmm2
divsd  %xmm3,%xmm2
movsd  %xmm2,(%r8)
movl   $0x0,(%r9)
movsd  (%rcx,%r10,8),%xmm2
mulsd  %xmm2,%xmm2
movapd %xmm0,%xmm3
addsd  %xmm2,%xmm3
subsd  %xmm0,%xmm2
mulsd  %xmm1,%xmm2
divsd  %xmm3,%xmm2
movsd  %xmm2,(%r8,%r11,8)
movl   $0x0,0x4(%r9)
add    $0x8,%r9
add    %rdx,%r8
add    %rax,%rcx
add    $0xfffffffe,%esi
jne    1140 <wavevelo+0x40>
test   $0x1,%dil
je     11d5 <wavevelo+0xd5>
movsd  (%rcx),%xmm1
mulsd  %xmm1,%xmm1
movapd %xmm1,%xmm2
subsd  %xmm0,%xmm2
mulsd  0xe3f(%rip),%xmm2
addsd  %xmm0,%xmm1
divsd  %xmm1,%xmm2
movsd  %xmm2,(%r8)
movl   $0x0,(%r9)
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i32 @wavevelo(double %0, i32 %1, i32 %2, i32 %3, double* nocapture %4, double* nocapture writeonly %5, i32* nocapture writeonly %6) {
%8 = fmul double %0, %0
%9 = icmp sgt i32 %1, 0
br i1 %9, label %10, label %54
10: ; preds = %7
%11 = sext i32 %2 to i64
%12 = sext i32 %3 to i64
%13 = and i32 %1, 1
%14 = icmp eq i32 %1, 1
br i1 %14, label %42, label %15
15: ; preds = %10
%16 = and i32 %1, -2
br label %17
17: ; preds = %17, %15
%18 = phi double* [ %5, %15 ], [ %39, %17 ]
%19 = phi double* [ %4, %15 ], [ %38, %17 ]
%20 = phi i32* [ %6, %15 ], [ %37, %17 ]
%21 = phi i32 [ 0, %15 ], [ %40, %17 ]
%22 = load double, double* %19
%23 = fmul double %22, %22
%24 = fsub double %23, %8
%25 = fmul double %24, 0x41B1DE784A000000
%26 = fadd double %8, %23
%27 = fdiv double %25, %26
store double %27, double* %18
%28 = getelementptr inbounds i32, i32* %20, i64 1
store i32 0, i32* %20
%29 = getelementptr inbounds double, double* %19, i64 %11
%30 = getelementptr inbounds double, double* %18, i64 %12
%31 = load double, double* %29
%32 = fmul double %31, %31
%33 = fsub double %32, %8
%34 = fmul double %33, 0x41B1DE784A000000
%35 = fadd double %8, %32
%36 = fdiv double %34, %35
store double %36, double* %30
%37 = getelementptr inbounds i32, i32* %20, i64 2
store i32 0, i32* %28
%38 = getelementptr inbounds double, double* %29, i64 %11
%39 = getelementptr inbounds double, double* %30, i64 %12
%40 = add i32 %21, 2
%41 = icmp eq i32 %40, %16
br i1 %41, label %42, label %17
42: ; preds = %17, %10
%43 = phi double* [ %5, %10 ], [ %39, %17 ]
%44 = phi double* [ %4, %10 ], [ %38, %17 ]
%45 = phi i32* [ %6, %10 ], [ %37, %17 ]
%46 = icmp eq i32 %13, 0
br i1 %46, label %54, label %47
47: ; preds = %42
%48 = load double, double* %44
%49 = fmul double %48, %48
%50 = fsub double %49, %8
%51 = fmul double %50, 0x41B1DE784A000000
%52 = fadd double %8, %49
%53 = fdiv double %51, %52
store double %53, double* %43
store i32 0, i32* %45
br label %54
54: ; preds = %47, %42, %7
ret i32 0
}