double euler(double a, double nx, double ny, double drhovx, double drhovy,
             double drhoe, double vx, double vy, double h, double drho) {
  double pR089 = nx * drhovx;
  double pR090 = ny * drhovy;
  double drhovn = pR089 + pR090;
  double pR103 = vx * vx;
  double pR104 = vy * vy;
  double vv = pR103 + pR104;
  double pR107 = nx * vx;
  double pR108 = ny * vy;
  double vn = pR107 + pR108;
  double pR113 = vx * drhovx;
  double pR114 = vy * drhovy;
  double vdrhov = pR113 + pR114;
  double pR117 = h - vv;
  double pR118 = drho * pR117;
  double pR119 = pR118 - drhoe;
  double tmp0 = pR119 + vdrhov;
  double pR120 = tmp0 * 0.4;
  double wave2_0 = pR120 / a;
  double pR121 = vn * drho;
  double tmp1 = drhovn - pR121;
  double tmp2 = wave2_0 - drho;
  double pR122 = tmp1 / a;
  double pR123 = pR122 - tmp2;
  double a3 = 0.5 * pR123;
  double vna = vn * a;
  double pR124 = h - vna;
  double wave1_0 = tmp2 - a3;
  double wave1_1 = wave1_0 * pR124;
  return wave1_1;
}


x86 assembly (clang, -O0):
<euler>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
movsd  0x18(%rbp),%xmm8
movsd  0x10(%rbp),%xmm8
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  %xmm5,-0x30(%rbp)
movsd  %xmm6,-0x38(%rbp)
movsd  %xmm7,-0x40(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x18(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x48(%rbp),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x18(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x78(%rbp),%xmm0
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
addsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  0x10(%rbp),%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  0x18(%rbp),%xmm0
mulsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
subsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  -0xb8(%rbp),%xmm0
ff
addsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  0xda7(%rip),%xmm0
mulsd  -0xc0(%rbp),%xmm0
ff
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0xc8(%rbp),%xmm0
ff
divsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
mulsd  0x18(%rbp),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
subsd  -0xd8(%rbp),%xmm0
ff
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0xd0(%rbp),%xmm0
ff
subsd  0x18(%rbp),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0xe0(%rbp),%xmm0
ff
divsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0xf0(%rbp)
ff
movsd  -0xf0(%rbp),%xmm0
ff
subsd  -0xe8(%rbp),%xmm0
ff
movsd  %xmm0,-0xf8(%rbp)
ff
movsd  0xd06(%rip),%xmm0
mulsd  -0xf8(%rbp),%xmm0
ff
movsd  %xmm0,-0x100(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
mulsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x108(%rbp)
ff
movsd  0x10(%rbp),%xmm0
subsd  -0x108(%rbp),%xmm0
ff
movsd  %xmm0,-0x110(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
subsd  -0x100(%rbp),%xmm0
ff
movsd  %xmm0,-0x118(%rbp)
ff
movsd  -0x118(%rbp),%xmm0
ff
mulsd  -0x110(%rbp),%xmm0
ff
movsd  %xmm0,-0x120(%rbp)
ff
movsd  -0x120(%rbp),%xmm0
ff
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<euler>:
movsd  0x10(%rsp),%xmm9
movsd  0x8(%rsp),%xmm8
movapd %xmm3,%xmm10
unpcklpd %xmm6,%xmm10
mulsd  %xmm6,%xmm3
movapd %xmm6,%xmm11
mulsd  %xmm6,%xmm11
movapd %xmm4,%xmm6
unpcklpd %xmm7,%xmm6
mulsd  %xmm7,%xmm4
mulsd  %xmm7,%xmm7
addsd  %xmm11,%xmm7
unpcklpd %xmm1,%xmm1
mulpd  %xmm1,%xmm10
unpcklpd %xmm2,%xmm2
mulpd  %xmm2,%xmm6
addpd  %xmm10,%xmm6
addsd  %xmm3,%xmm4
movapd %xmm8,%xmm1
subsd  %xmm7,%xmm1
mulsd  %xmm9,%xmm1
subsd  %xmm5,%xmm1
addsd  %xmm4,%xmm1
mulsd  0xe8d(%rip),%xmm1
divsd  %xmm0,%xmm1
movapd %xmm6,%xmm2
unpckhpd %xmm6,%xmm2
movapd %xmm2,%xmm3
mulsd  %xmm9,%xmm3
subsd  %xmm3,%xmm6
subsd  %xmm9,%xmm1
divsd  %xmm0,%xmm6
subsd  %xmm1,%xmm6
mulsd  0xe67(%rip),%xmm6
mulsd  %xmm0,%xmm2
subsd  %xmm2,%xmm8
addsd  %xmm1,%xmm6
mulsd  %xmm8,%xmm6
movapd %xmm6,%xmm0
ret

LLVM IR (-O0):
define double @euler(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9) {
%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
%45 = alloca double
%46 = alloca double
%47 = alloca double
%48 = alloca double
store double %0, double* %11
store double %1, double* %12
store double %2, double* %13
store double %3, double* %14
store double %4, double* %15
store double %5, double* %16
store double %6, double* %17
store double %7, double* %18
store double %8, double* %19
store double %9, double* %20
%49 = load double, double* %12
%50 = load double, double* %14
%51 = fmul double %49, %50
store double %51, double* %21
%52 = load double, double* %13
%53 = load double, double* %15
%54 = fmul double %52, %53
store double %54, double* %22
%55 = load double, double* %21
%56 = load double, double* %22
%57 = fadd double %55, %56
store double %57, double* %23
%58 = load double, double* %17
%59 = load double, double* %17
%60 = fmul double %58, %59
store double %60, double* %24
%61 = load double, double* %18
%62 = load double, double* %18
%63 = fmul double %61, %62
store double %63, double* %25
%64 = load double, double* %24
%65 = load double, double* %25
%66 = fadd double %64, %65
store double %66, double* %26
%67 = load double, double* %12
%68 = load double, double* %17
%69 = fmul double %67, %68
store double %69, double* %27
%70 = load double, double* %13
%71 = load double, double* %18
%72 = fmul double %70, %71
store double %72, double* %28
%73 = load double, double* %27
%74 = load double, double* %28
%75 = fadd double %73, %74
store double %75, double* %29
%76 = load double, double* %17
%77 = load double, double* %14
%78 = fmul double %76, %77
store double %78, double* %30
%79 = load double, double* %18
%80 = load double, double* %15
%81 = fmul double %79, %80
store double %81, double* %31
%82 = load double, double* %30
%83 = load double, double* %31
%84 = fadd double %82, %83
store double %84, double* %32
%85 = load double, double* %19
%86 = load double, double* %26
%87 = fsub double %85, %86
store double %87, double* %33
%88 = load double, double* %20
%89 = load double, double* %33
%90 = fmul double %88, %89
store double %90, double* %34
%91 = load double, double* %34
%92 = load double, double* %16
%93 = fsub double %91, %92
store double %93, double* %35
%94 = load double, double* %35
%95 = load double, double* %32
%96 = fadd double %94, %95
store double %96, double* %36
%97 = load double, double* %36
%98 = fmul double %97, 4.000000e-01
store double %98, double* %37
%99 = load double, double* %37
%100 = load double, double* %11
%101 = fdiv double %99, %100
store double %101, double* %38
%102 = load double, double* %29
%103 = load double, double* %20
%104 = fmul double %102, %103
store double %104, double* %39
%105 = load double, double* %23
%106 = load double, double* %39
%107 = fsub double %105, %106
store double %107, double* %40
%108 = load double, double* %38
%109 = load double, double* %20
%110 = fsub double %108, %109
store double %110, double* %41
%111 = load double, double* %40
%112 = load double, double* %11
%113 = fdiv double %111, %112
store double %113, double* %42
%114 = load double, double* %42
%115 = load double, double* %41
%116 = fsub double %114, %115
store double %116, double* %43
%117 = load double, double* %43
%118 = fmul double 5.000000e-01, %117
store double %118, double* %44
%119 = load double, double* %29
%120 = load double, double* %11
%121 = fmul double %119, %120
store double %121, double* %45
%122 = load double, double* %19
%123 = load double, double* %45
%124 = fsub double %122, %123
store double %124, double* %46
%125 = load double, double* %41
%126 = load double, double* %44
%127 = fsub double %125, %126
store double %127, double* %47
%128 = load double, double* %47
%129 = load double, double* %46
%130 = fmul double %128, %129
store double %130, double* %48
%131 = load double, double* %48
ret double %131
}

LLVM IR (-O2):
define double @euler(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9) {
%11 = fmul double %6, %6
%12 = fmul double %7, %7
%13 = fadd double %11, %12
%14 = insertelement <2 x double> poison, double %1, i64 0
%15 = shufflevector <2 x double> %14, <2 x double> poison, <2 x i32> zeroinitializer
%16 = insertelement <2 x double> poison, double %3, i64 0
%17 = insertelement <2 x double> %16, double %6, i64 1
%18 = fmul <2 x double> %15, %17
%19 = insertelement <2 x double> poison, double %2, i64 0
%20 = shufflevector <2 x double> %19, <2 x double> poison, <2 x i32> zeroinitializer
%21 = insertelement <2 x double> poison, double %4, i64 0
%22 = insertelement <2 x double> %21, double %7, i64 1
%23 = fmul <2 x double> %20, %22
%24 = fadd <2 x double> %18, %23
%25 = fmul double %3, %6
%26 = fmul double %4, %7
%27 = fadd double %25, %26
%28 = fsub double %8, %13
%29 = fmul double %28, %9
%30 = fsub double %29, %5
%31 = fadd double %27, %30
%32 = fmul double %31, 4.000000e-01
%33 = fdiv double %32, %0
%34 = extractelement <2 x double> %24, i64 1
%35 = fmul double %34, %9
%36 = extractelement <2 x double> %24, i64 0
%37 = fsub double %36, %35
%38 = fsub double %33, %9
%39 = fdiv double %37, %0
%40 = fsub double %39, %38
%41 = fmul double %40, 5.000000e-01
%42 = fmul double %34, %0
%43 = fsub double %8, %42
%44 = fsub double %38, %41
%45 = fmul double %43, %44
ret double %45
}