void RotateAbout(vp, v, n, theta) double vp[3], v[3], n[3], theta;
{
  double X, Y, Z, x, y, z, sintheta, costheta, t1, t2, t3, t4, t5;
  double t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17;
  double t18, t19, a, b, c, d, e, f, g, h, i;
  X = v[0];
  Y = v[1];
  Z = v[2];
  x = n[0];
  y = n[1];
  z = n[2];
  sintheta = sin(theta);
  costheta = cos(theta);
  t1 = x * x;
  t2 = y * y;
  t3 = z * z;
  t4 = 1.0 - t1;
  t5 = 1.0 - t2;
  t6 = 1.0 - t3;
  t7 = 1.0 - costheta;
  t8 = x * y;
  t9 = x * z;
  t10 = y * z;
  t11 = x * sintheta;
  t12 = y * sintheta;
  t13 = z * sintheta;
  t14 = t4 * costheta;
  t15 = t5 * costheta;
  t16 = t6 * costheta;
  t17 = t8 * t7;
  t18 = t9 * t7;
  t19 = t10 * t7;
  a = t1 + t14;
  b = t17 + t13;
  c = t18 - t12;
  d = t17 - t13;
  e = t2 + t15;
  f = t19 + t11;
  g = t18 + t12;
  h = t19 - t11;
  i = t3 + t16;
  vp[0] = X * a + Y * b + Z * c;
  vp[1] = X * d + Y * e + Z * f;
  vp[2] = X * g + Y * h + Z * i;
}


x86 assembly (clang, -O0):
<RotateAbout>:
push   %rbp
mov    %rsp,%rbp
sub    $0x140,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x20(%rbp),%xmm0
call   1030 <sin@plt>
movsd  %xmm0,-0x58(%rbp)
movsd  -0x20(%rbp),%xmm0
call   1040 <cos@plt>
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x50(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  0xe1f(%rip),%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  0xe0d(%rip),%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  0xdf8(%rip),%xmm0
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  0xde3(%rip),%xmm0
subsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0xa0(%rbp),%xmm0
ff
mulsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0xa8(%rbp),%xmm0
ff
mulsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0xf0(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
mulsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0xf8(%rbp)
ff
movsd  -0x68(%rbp),%xmm0
addsd  -0xd0(%rbp),%xmm0
ff
movsd  %xmm0,-0x100(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
addsd  -0xc8(%rbp),%xmm0
ff
movsd  %xmm0,-0x108(%rbp)
ff
movsd  -0xf0(%rbp),%xmm0
ff
subsd  -0xc0(%rbp),%xmm0
ff
movsd  %xmm0,-0x110(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
subsd  -0xc8(%rbp),%xmm0
ff
movsd  %xmm0,-0x118(%rbp)
ff
movsd  -0x70(%rbp),%xmm0
addsd  -0xd8(%rbp),%xmm0
ff
movsd  %xmm0,-0x120(%rbp)
ff
movsd  -0xf8(%rbp),%xmm0
ff
addsd  -0xb8(%rbp),%xmm0
ff
movsd  %xmm0,-0x128(%rbp)
ff
movsd  -0xf0(%rbp),%xmm0
ff
addsd  -0xc0(%rbp),%xmm0
ff
movsd  %xmm0,-0x130(%rbp)
ff
movsd  -0xf8(%rbp),%xmm0
ff
subsd  -0xb8(%rbp),%xmm0
ff
movsd  %xmm0,-0x138(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
addsd  -0xe0(%rbp),%xmm0
ff
movsd  %xmm0,-0x140(%rbp)
ff
movsd  -0x28(%rbp),%xmm1
movsd  -0x100(%rbp),%xmm2
ff
movsd  -0x30(%rbp),%xmm0
mulsd  -0x108(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
movsd  -0x110(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x28(%rbp),%xmm1
movsd  -0x118(%rbp),%xmm2
ff
movsd  -0x30(%rbp),%xmm0
mulsd  -0x120(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
movsd  -0x128(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x28(%rbp),%xmm1
movsd  -0x130(%rbp),%xmm2
ff
movsd  -0x30(%rbp),%xmm0
mulsd  -0x138(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
movsd  -0x140(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x10(%rax)
add    $0x140,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<RotateAbout>:
push   %rbx
sub    $0x80,%rsp
movaps %xmm0,%xmm1
movsd  %xmm0,0x8(%rsp)
mov    %rdi,%rbx
movsd  (%rsi),%xmm0
movaps %xmm0,0x60(%rsp)
movsd  0x8(%rsi),%xmm0
movaps %xmm0,0x50(%rsp)
movsd  0x10(%rsi),%xmm0
movaps %xmm0,0x70(%rsp)
movsd  (%rdx),%xmm0
movaps %xmm0,0x40(%rsp)
movsd  0x8(%rdx),%xmm0
movaps %xmm0,0x10(%rsp)
movsd  0x10(%rdx),%xmm0
movaps %xmm0,0x20(%rsp)
movaps %xmm1,%xmm0
call   1030 <sin@plt>
movaps %xmm0,0x30(%rsp)
movsd  0x8(%rsp),%xmm0
call   1040 <cos@plt>
movapd 0x10(%rsp),%xmm12
movapd %xmm12,%xmm9
mulsd  %xmm12,%xmm9
movapd 0x20(%rsp),%xmm4
movapd %xmm4,%xmm8
mulsd  %xmm4,%xmm8
movsd  0xe51(%rip),%xmm1
movapd %xmm1,%xmm10
subsd  %xmm9,%xmm10
subsd  %xmm8,%xmm1
movapd 0x40(%rsp),%xmm7
movapd %xmm7,%xmm2
unpcklpd %xmm4,%xmm2
movapd %xmm7,%xmm6
movapd 0x30(%rsp),%xmm11
unpcklpd %xmm11,%xmm6
mulpd  %xmm2,%xmm6
movapd %xmm6,%xmm3
unpcklpd %xmm0,%xmm3
movapd 0xe20(%rip),%xmm2
subpd  %xmm3,%xmm2
movapd %xmm7,%xmm5
mulsd  %xmm12,%xmm5
movapd %xmm7,%xmm3
mulsd  %xmm4,%xmm3
mulsd  %xmm12,%xmm4
mulsd  %xmm0,%xmm10
mulsd  %xmm0,%xmm1
unpcklpd %xmm5,%xmm0
mulpd  %xmm2,%xmm0
unpcklpd %xmm7,%xmm3
movapd %xmm2,%xmm7
shufpd $0x1,%xmm11,%xmm7
mulpd  %xmm3,%xmm7
movapd %xmm12,%xmm3
unpcklpd %xmm4,%xmm3
movsd  %xmm11,%xmm2
mulpd  %xmm3,%xmm2
movapd %xmm0,%xmm3
addpd  %xmm6,%xmm3
movapd %xmm0,%xmm5
subpd  %xmm6,%xmm5
movsd  %xmm3,%xmm5
shufpd $0x1,%xmm9,%xmm6
shufpd $0x1,%xmm10,%xmm0
addpd  %xmm6,%xmm0
movapd %xmm7,%xmm3
subpd  %xmm2,%xmm3
movapd %xmm7,%xmm6
addpd  %xmm2,%xmm6
movsd  %xmm3,%xmm6
movapd %xmm2,%xmm4
addsd  %xmm7,%xmm4
subpd  %xmm7,%xmm2
unpckhpd %xmm2,%xmm2
addsd  %xmm8,%xmm1
movapd 0x50(%rsp),%xmm8
movapd %xmm8,%xmm3
unpcklpd %xmm8,%xmm3
mulpd  %xmm0,%xmm3
movapd 0x60(%rsp),%xmm7
movapd %xmm7,%xmm0
unpcklpd %xmm7,%xmm0
mulpd  %xmm5,%xmm0
addpd  %xmm3,%xmm0
movapd 0x70(%rsp),%xmm5
movapd %xmm5,%xmm3
unpcklpd %xmm5,%xmm3
mulpd  %xmm6,%xmm3
addpd  %xmm0,%xmm3
movupd %xmm3,(%rbx)
mulsd  %xmm8,%xmm2
mulsd  %xmm7,%xmm4
addsd  %xmm2,%xmm4
mulsd  %xmm5,%xmm1
addsd  %xmm4,%xmm1
movsd  %xmm1,0x10(%rbx)
add    $0x80,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define void @RotateAbout(double* %0, double* %1, double* %2, double %3) {
%5 = alloca double*
%6 = alloca double*
%7 = alloca double*
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca double
%33 = alloca double
%34 = alloca double
%35 = alloca double
%36 = alloca double
%37 = alloca double
%38 = alloca double
%39 = alloca double
%40 = alloca double
%41 = alloca double
%42 = alloca double
%43 = alloca double
%44 = alloca double
store double* %0, double** %5
store double* %1, double** %6
store double* %2, double** %7
store double %3, double* %8
%45 = load double*, double** %6
%46 = getelementptr inbounds double, double* %45, i64 0
%47 = load double, double* %46
store double %47, double* %9
%48 = load double*, double** %6
%49 = getelementptr inbounds double, double* %48, i64 1
%50 = load double, double* %49
store double %50, double* %10
%51 = load double*, double** %6
%52 = getelementptr inbounds double, double* %51, i64 2
%53 = load double, double* %52
store double %53, double* %11
%54 = load double*, double** %7
%55 = getelementptr inbounds double, double* %54, i64 0
%56 = load double, double* %55
store double %56, double* %12
%57 = load double*, double** %7
%58 = getelementptr inbounds double, double* %57, i64 1
%59 = load double, double* %58
store double %59, double* %13
%60 = load double*, double** %7
%61 = getelementptr inbounds double, double* %60, i64 2
%62 = load double, double* %61
store double %62, double* %14
%63 = load double, double* %8
%64 = call double @sin(double %63)
store double %64, double* %15
%65 = load double, double* %8
%66 = call double @cos(double %65)
store double %66, double* %16
%67 = load double, double* %12
%68 = load double, double* %12
%69 = fmul double %67, %68
store double %69, double* %17
%70 = load double, double* %13
%71 = load double, double* %13
%72 = fmul double %70, %71
store double %72, double* %18
%73 = load double, double* %14
%74 = load double, double* %14
%75 = fmul double %73, %74
store double %75, double* %19
%76 = load double, double* %17
%77 = fsub double 1.000000e+00, %76
store double %77, double* %20
%78 = load double, double* %18
%79 = fsub double 1.000000e+00, %78
store double %79, double* %21
%80 = load double, double* %19
%81 = fsub double 1.000000e+00, %80
store double %81, double* %22
%82 = load double, double* %16
%83 = fsub double 1.000000e+00, %82
store double %83, double* %23
%84 = load double, double* %12
%85 = load double, double* %13
%86 = fmul double %84, %85
store double %86, double* %24
%87 = load double, double* %12
%88 = load double, double* %14
%89 = fmul double %87, %88
store double %89, double* %25
%90 = load double, double* %13
%91 = load double, double* %14
%92 = fmul double %90, %91
store double %92, double* %26
%93 = load double, double* %12
%94 = load double, double* %15
%95 = fmul double %93, %94
store double %95, double* %27
%96 = load double, double* %13
%97 = load double, double* %15
%98 = fmul double %96, %97
store double %98, double* %28
%99 = load double, double* %14
%100 = load double, double* %15
%101 = fmul double %99, %100
store double %101, double* %29
%102 = load double, double* %20
%103 = load double, double* %16
%104 = fmul double %102, %103
store double %104, double* %30
%105 = load double, double* %21
%106 = load double, double* %16
%107 = fmul double %105, %106
store double %107, double* %31
%108 = load double, double* %22
%109 = load double, double* %16
%110 = fmul double %108, %109
store double %110, double* %32
%111 = load double, double* %24
%112 = load double, double* %23
%113 = fmul double %111, %112
store double %113, double* %33
%114 = load double, double* %25
%115 = load double, double* %23
%116 = fmul double %114, %115
store double %116, double* %34
%117 = load double, double* %26
%118 = load double, double* %23
%119 = fmul double %117, %118
store double %119, double* %35
%120 = load double, double* %17
%121 = load double, double* %30
%122 = fadd double %120, %121
store double %122, double* %36
%123 = load double, double* %33
%124 = load double, double* %29
%125 = fadd double %123, %124
store double %125, double* %37
%126 = load double, double* %34
%127 = load double, double* %28
%128 = fsub double %126, %127
store double %128, double* %38
%129 = load double, double* %33
%130 = load double, double* %29
%131 = fsub double %129, %130
store double %131, double* %39
%132 = load double, double* %18
%133 = load double, double* %31
%134 = fadd double %132, %133
store double %134, double* %40
%135 = load double, double* %35
%136 = load double, double* %27
%137 = fadd double %135, %136
store double %137, double* %41
%138 = load double, double* %34
%139 = load double, double* %28
%140 = fadd double %138, %139
store double %140, double* %42
%141 = load double, double* %35
%142 = load double, double* %27
%143 = fsub double %141, %142
store double %143, double* %43
%144 = load double, double* %19
%145 = load double, double* %32
%146 = fadd double %144, %145
store double %146, double* %44
%147 = load double, double* %9
%148 = load double, double* %36
%149 = load double, double* %10
%150 = load double, double* %37
%151 = fmul double %149, %150
%152 = call double @llvm.fmuladd.f64(double %147, double %148, double %151)
%153 = load double, double* %11
%154 = load double, double* %38
%155 = call double @llvm.fmuladd.f64(double %153, double %154, double %152)
%156 = load double*, double** %5
%157 = getelementptr inbounds double, double* %156, i64 0
store double %155, double* %157
%158 = load double, double* %9
%159 = load double, double* %39
%160 = load double, double* %10
%161 = load double, double* %40
%162 = fmul double %160, %161
%163 = call double @llvm.fmuladd.f64(double %158, double %159, double %162)
%164 = load double, double* %11
%165 = load double, double* %41
%166 = call double @llvm.fmuladd.f64(double %164, double %165, double %163)
%167 = load double*, double** %5
%168 = getelementptr inbounds double, double* %167, i64 1
store double %166, double* %168
%169 = load double, double* %9
%170 = load double, double* %42
%171 = load double, double* %10
%172 = load double, double* %43
%173 = fmul double %171, %172
%174 = call double @llvm.fmuladd.f64(double %169, double %170, double %173)
%175 = load double, double* %11
%176 = load double, double* %44
%177 = call double @llvm.fmuladd.f64(double %175, double %176, double %174)
%178 = load double*, double** %5
%179 = getelementptr inbounds double, double* %178, i64 2
store double %177, double* %179
ret void
}

LLVM IR (-O2):
define void @RotateAbout(double* nocapture writeonly %0, double* nocapture %1, double* nocapture %2, double %3) {
%5 = load double, double* %1
%6 = getelementptr inbounds double, double* %1, i64 1
%7 = load double, double* %6
%8 = getelementptr inbounds double, double* %1, i64 2
%9 = load double, double* %8
%10 = load double, double* %2
%11 = getelementptr inbounds double, double* %2, i64 1
%12 = load double, double* %11
%13 = getelementptr inbounds double, double* %2, i64 2
%14 = load double, double* %13
%15 = tail call double @sin(double %3)
%16 = tail call double @cos(double %3)
%17 = fmul double %12, %12
%18 = fmul double %14, %14
%19 = fsub double 1.000000e+00, %17
%20 = fsub double 1.000000e+00, %18
%21 = insertelement <2 x double> poison, double %10, i64 0
%22 = insertelement <2 x double> %21, double %14, i64 1
%23 = insertelement <2 x double> %21, double %15, i64 1
%24 = fmul <2 x double> %22, %23
%25 = insertelement <2 x double> %24, double %16, i64 1
%26 = fsub <2 x double> <double 1.000000e+00, double 1.000000e+00>, %25
%27 = fmul double %10, %12
%28 = fmul double %10, %14
%29 = fmul double %12, %14
%30 = fmul double %19, %16
%31 = fmul double %20, %16
%32 = insertelement <2 x double> poison, double %16, i64 0
%33 = insertelement <2 x double> %32, double %27, i64 1
%34 = fmul <2 x double> %26, %33
%35 = insertelement <2 x double> poison, double %28, i64 0
%36 = insertelement <2 x double> %35, double %10, i64 1
%37 = extractelement <2 x double> %26, i64 1
%38 = insertelement <2 x double> poison, double %37, i64 0
%39 = insertelement <2 x double> %38, double %15, i64 1
%40 = fmul <2 x double> %36, %39
%41 = insertelement <2 x double> poison, double %12, i64 0
%42 = insertelement <2 x double> %41, double %29, i64 1
%43 = insertelement <2 x double> %26, double %15, i64 0
%44 = fmul <2 x double> %42, %43
%45 = fadd <2 x double> %34, %24
%46 = fsub <2 x double> %34, %24
%47 = shufflevector <2 x double> %45, <2 x double> %46, <2 x i32> <i32 0, i32 3>
%48 = extractelement <2 x double> %24, i64 1
%49 = insertelement <2 x double> poison, double %48, i64 0
%50 = insertelement <2 x double> %49, double %17, i64 1
%51 = extractelement <2 x double> %34, i64 1
%52 = insertelement <2 x double> poison, double %51, i64 0
%53 = insertelement <2 x double> %52, double %30, i64 1
%54 = fadd <2 x double> %50, %53
%55 = fsub <2 x double> %40, %44
%56 = fadd <2 x double> %40, %44
%57 = shufflevector <2 x double> %55, <2 x double> %56, <2 x i32> <i32 0, i32 3>
%58 = fadd <2 x double> %44, %40
%59 = extractelement <2 x double> %58, i64 0
%60 = fsub <2 x double> %44, %40
%61 = extractelement <2 x double> %60, i64 1
%62 = fadd double %18, %31
%63 = insertelement <2 x double> poison, double %7, i64 0
%64 = shufflevector <2 x double> %63, <2 x double> poison, <2 x i32> zeroinitializer
%65 = fmul <2 x double> %64, %54
%66 = insertelement <2 x double> poison, double %5, i64 0
%67 = shufflevector <2 x double> %66, <2 x double> poison, <2 x i32> zeroinitializer
%68 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %67, <2 x double> %47, <2 x double> %65)
%69 = insertelement <2 x double> poison, double %9, i64 0
%70 = shufflevector <2 x double> %69, <2 x double> poison, <2 x i32> zeroinitializer
%71 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %70, <2 x double> %57, <2 x double> %68)
%72 = bitcast double* %0 to <2 x double>*
store <2 x double> %71, <2 x double>* %72
%73 = fmul double %7, %61
%74 = tail call double @llvm.fmuladd.f64(double %5, double %59, double %73)
%75 = tail call double @llvm.fmuladd.f64(double %9, double %62, double %74)
%76 = getelementptr inbounds double, double* %0, i64 2
store double %75, double* %76
ret void
}