float cross2d(x11, x12, x21, x22, D)
float x11, x12, x21, x22;
int D;
{
  float temp;
  if (1 == D)
    temp = (x11 * x22 - x12 * x21);
  if (2 == D)
    temp = (-x11 * x22 + x12 * x21);
  if (3 == D)
    temp = (x11 * x22 - x12 * x21);
  return (temp);
}


x86 assembly (clang, -O0):
<cross2d>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm2,-0x28(%rbp)
movaps %xmm1,%xmm2
movsd  -0x28(%rbp),%xmm1
movaps %xmm0,%xmm3
movsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm3,%xmm3
cvtsd2ss %xmm2,%xmm2
cvtsd2ss %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm0
movss  %xmm3,-0x4(%rbp)
movss  %xmm2,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  %xmm0,-0x10(%rbp)
mov    %edi,-0x14(%rbp)
mov    $0x1,%eax
cmp    -0x14(%rbp),%eax
jne    1181 <cross2d+0x81>
movss  -0x4(%rbp),%xmm0
movss  -0x10(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    $0x2,%eax
cmp    -0x14(%rbp),%eax
jne    11bd <cross2d+0xbd>
movss  -0x4(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  -0x10(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    $0x3,%eax
cmp    -0x14(%rbp),%eax
jne    11f9 <cross2d+0xf9>
movss  -0x4(%rbp),%xmm0
movss  -0x10(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<cross2d>:
cvtsd2ss %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm4
xorps  %xmm1,%xmm1
cvtsd2ss %xmm2,%xmm1
xorps  %xmm2,%xmm2
cvtsd2ss %xmm3,%xmm2
mulss  %xmm4,%xmm1
mulss  %xmm0,%xmm2
movaps %xmm2,%xmm0
subss  %xmm1,%xmm0
cmp    $0x2,%edi
je     1134 <cross2d+0x34>
movaps %xmm0,%xmm1
cmp    $0x3,%edi
jne    113d <cross2d+0x3d>
jmp    1140 <cross2d+0x40>
subss  %xmm2,%xmm1
cmp    $0x3,%edi
je     1140 <cross2d+0x40>
movaps %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @cross2d(double %0, double %1, double %2, double %3, i32 %4) {
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca i32
%11 = alloca float
%12 = fptrunc double %0 to float
%13 = fptrunc double %1 to float
%14 = fptrunc double %2 to float
%15 = fptrunc double %3 to float
store float %12, float* %6
store float %13, float* %7
store float %14, float* %8
store float %15, float* %9
store i32 %4, i32* %10
%16 = load i32, i32* %10
%17 = icmp eq i32 1, %16
br i1 %17, label %18, label %26
18: ; preds = %5
%19 = load float, float* %6
%20 = load float, float* %9
%21 = load float, float* %7
%22 = load float, float* %8
%23 = fmul float %21, %22
%24 = fneg float %23
%25 = call float @llvm.fmuladd.f32(float %19, float %20, float %24)
store float %25, float* %11
br label %26
26: ; preds = %18, %5
%27 = load i32, i32* %10
%28 = icmp eq i32 2, %27
br i1 %28, label %29, label %37
29: ; preds = %26
%30 = load float, float* %6
%31 = fneg float %30
%32 = load float, float* %9
%33 = load float, float* %7
%34 = load float, float* %8
%35 = fmul float %33, %34
%36 = call float @llvm.fmuladd.f32(float %31, float %32, float %35)
store float %36, float* %11
br label %37
37: ; preds = %29, %26
%38 = load i32, i32* %10
%39 = icmp eq i32 3, %38
br i1 %39, label %40, label %48
40: ; preds = %37
%41 = load float, float* %6
%42 = load float, float* %9
%43 = load float, float* %7
%44 = load float, float* %8
%45 = fmul float %43, %44
%46 = fneg float %45
%47 = call float @llvm.fmuladd.f32(float %41, float %42, float %46)
store float %47, float* %11
br label %48
48: ; preds = %40, %37
%49 = load float, float* %11
ret float %49
}

LLVM IR (-O2):
define float @cross2d(double %0, double %1, double %2, double %3, i32 %4) {
%6 = fptrunc double %0 to float
%7 = fptrunc double %1 to float
%8 = fptrunc double %2 to float
%9 = fptrunc double %3 to float
%10 = icmp eq i32 %4, 1
%11 = fneg float %7
%12 = fmul float %11, %8
%13 = tail call float @llvm.fmuladd.f32(float %6, float %9, float %12)
%14 = select i1 %10, float %13, float undef
%15 = icmp eq i32 %4, 2
%16 = fneg float %6
%17 = fmul float %7, %8
%18 = tail call float @llvm.fmuladd.f32(float %16, float %9, float %17)
%19 = select i1 %15, float %18, float %14
%20 = icmp eq i32 %4, 3
%21 = select i1 %20, float %13, float %19
ret float %21
}