void UnitVectorNV(float *wx, float *wy, float *wz, float ux, float uy,
                  float uz) {
  if (ux > 0.1 || ux < -0.1) {
    *wx = -uy;
    *wy = ux;
    *wz = 0.0f;
  } else {
    *wx = 0.0f;
    *wy = -uz;
    *wz = uy;
  }
}


x86 assembly (clang, -O0):
<UnitVectorNV>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movss  %xmm0,-0x1c(%rbp)
movss  %xmm1,-0x20(%rbp)
movss  %xmm2,-0x24(%rbp)
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xed0(%rip),%xmm1
ucomisd %xmm1,%xmm0
ja     1155 <UnitVectorNV+0x55>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xebd(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    118c <UnitVectorNV+0x8c>
movss  -0x20(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x1c(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
jmp    11be <UnitVectorNV+0xbe>
mov    -0x8(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
movss  -0x24(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x20(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<UnitVectorNV>:
cvtss2sd %xmm0,%xmm3
ucomisd 0xef4(%rip),%xmm3
ja     112e <UnitVectorNV+0x2e>
movsd  0xef2(%rip),%xmm4
ucomisd %xmm3,%xmm4
ja     112e <UnitVectorNV+0x2e>
movl   $0x0,(%rdi)
xorps  0xee7(%rip),%xmm2
movaps %xmm2,%xmm0
jmp    113c <UnitVectorNV+0x3c>
xorps  0xedb(%rip),%xmm1
movss  %xmm1,(%rdi)
xorps  %xmm1,%xmm1
movss  %xmm0,(%rsi)
movss  %xmm1,(%rdx)
ret

LLVM IR (-O0):
define void @UnitVectorNV(float* %0, float* %1, float* %2, float %3, float %4, float %5) {
%7 = alloca float*
%8 = alloca float*
%9 = alloca float*
%10 = alloca float
%11 = alloca float
%12 = alloca float
store float* %0, float** %7
store float* %1, float** %8
store float* %2, float** %9
store float %3, float* %10
store float %4, float* %11
store float %5, float* %12
%13 = load float, float* %10
%14 = fpext float %13 to double
%15 = fcmp ogt double %14, 1.000000e-01
br i1 %15, label %20, label %16
16: ; preds = %6
%17 = load float, float* %10
%18 = fpext float %17 to double
%19 = fcmp olt double %18, -1.000000e-01
br i1 %19, label %20, label %27
20: ; preds = %16, %6
%21 = load float, float* %11
%22 = fneg float %21
%23 = load float*, float** %7
store float %22, float* %23
%24 = load float, float* %10
%25 = load float*, float** %8
store float %24, float* %25
%26 = load float*, float** %9
store float 0.000000e+00, float* %26
br label %34
27: ; preds = %16
%28 = load float*, float** %7
store float 0.000000e+00, float* %28
%29 = load float, float* %12
%30 = fneg float %29
%31 = load float*, float** %8
store float %30, float* %31
%32 = load float, float* %11
%33 = load float*, float** %9
store float %32, float* %33
br label %34
34: ; preds = %27, %20
ret void
}

LLVM IR (-O2):
define void @UnitVectorNV(float* nocapture writeonly %0, float* nocapture writeonly %1, float* nocapture writeonly %2, float %3, float %4, float %5) {
%7 = fpext float %3 to double
%8 = fcmp ogt double %7, 1.000000e-01
%9 = fcmp olt double %7, -1.000000e-01
%10 = or i1 %8, %9
br i1 %10, label %11, label %13
11: ; preds = %6
%12 = fneg float %4
store float %12, float* %0
br label %15
13: ; preds = %6
store float 0.000000e+00, float* %0
%14 = fneg float %5
br label %15
15: ; preds = %13, %11
%16 = phi float [ %14, %13 ], [ %3, %11 ]
%17 = phi float [ %4, %13 ], [ 0.000000e+00, %11 ]
store float %16, float* %1
store float %17, float* %2
ret void
}