#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef long uint;

/* Variables and functions */
int /*<<< orphan*/ SIGFPE;
int /*<<< orphan*/ raise(int /*<<< orphan*/);
float __mulsf3(float a, float b) {
  uint au, al, bu, bl, cu, cl, sign;
  long lc;
  uint expt;
  if (!((*(const long *)&a) & 0x7fffffff) ||
      !((*(const long *)&b) & 0x7fffffff))
    return 0;
  au = (((*(const long *)&a) >> 8) & 0x7fff) | 0x8000;
  bu = (((*(const long *)&b) >> 8) & 0x7fff) | 0x8000;
  cu = au * bu;
  if ((al = (*(const long *)&a) & 0xff) != 0) {
    cl = bu * al;
  } else
    cl = 0;
  if ((bl = (*(const long *)&b) & 0xff) != 0) {
    cl += au * bl;
    if (al)
      cl += (al * bl) >> 8;
  }
  cu += cl >> 8;
  sign = ((*(const long *)&a) ^ (*(const long *)&b)) & 0x80000000;
  expt = ((*(const long *)&a) & 0x7f800000) +
         ((*(const long *)&b) & 0x7f800000) - (127 << 23);
  if (cu <= 0x7fffffff)
    cu <<= 1;
  else
    expt += 1 << 23;
  cu = ((cu >> 7) + 1) >> 1;
  if (expt < 1 << 23)
    lc = sign;
  else if (expt > (uint)(254 << 23)) {
    if (expt <= 0xc0000000) {
      raise(SIGFPE);
      lc = sign + 0x7f800000;
    } else {
      lc = sign;
    }
  } else
    lc = sign + expt + cu - 0x800000;
  return (*(const float *)&lc);
}


x86 assembly (clang, -O0):
<__mulsf3>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
mov    -0x8(%rbp),%rax
and    $0x7fffffff,%rax
cmp    $0x0,%rax
je     114a <__mulsf3+0x3a>
mov    -0xc(%rbp),%rax
and    $0x7fffffff,%rax
cmp    $0x0,%rax
jne    1157 <__mulsf3+0x47>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    132b <__mulsf3+0x21b>
mov    -0x8(%rbp),%rax
sar    $0x8,%rax
and    $0x7fff,%rax
or     $0x8000,%rax
mov    %rax,-0x18(%rbp)
mov    -0xc(%rbp),%rax
sar    $0x8,%rax
and    $0x7fff,%rax
or     $0x8000,%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
imul   -0x28(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
and    $0xff,%rax
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
je     11be <__mulsf3+0xae>
mov    -0x28(%rbp),%rax
imul   -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
jmp    11c6 <__mulsf3+0xb6>
movq   $0x0,-0x40(%rbp)
mov    -0xc(%rbp),%rax
and    $0xff,%rax
mov    %rax,-0x30(%rbp)
cmp    $0x0,%rax
je     1214 <__mulsf3+0x104>
mov    -0x18(%rbp),%rax
imul   -0x30(%rbp),%rax
add    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x20(%rbp)
je     120f <__mulsf3+0xff>
mov    -0x20(%rbp),%rax
imul   -0x30(%rbp),%rax
sar    $0x8,%rax
add    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
jmp    1214 <__mulsf3+0x104>
mov    -0x40(%rbp),%rax
sar    $0x8,%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
xor    -0xc(%rbp),%rax
movabs $0x80000000,%rcx
and    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x8(%rbp),%rax
and    $0x7f800000,%rax
mov    -0xc(%rbp),%rcx
and    $0x7f800000,%rcx
add    %rcx,%rax
sub    $0x3f800000,%rax
mov    %rax,-0x58(%rbp)
cmpq   $0x7fffffff,-0x38(%rbp)
7f
jg     127e <__mulsf3+0x16e>
mov    -0x38(%rbp),%rax
shl    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    128c <__mulsf3+0x17c>
mov    -0x58(%rbp),%rax
add    $0x800000,%rax
mov    %rax,-0x58(%rbp)
mov    -0x38(%rbp),%rax
sar    $0x7,%rax
add    $0x1,%rax
sar    $0x1,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x800000,-0x58(%rbp)
jge    12bb <__mulsf3+0x1ab>
mov    -0x48(%rbp),%rax
mov    %rax,-0x50(%rbp)
jmp    1321 <__mulsf3+0x211>
cmpq   $0x7f000000,-0x58(%rbp)
7f
jle    1306 <__mulsf3+0x1f6>
mov    $0xc0000000,%eax
cmp    %rax,-0x58(%rbp)
jg     12f9 <__mulsf3+0x1e9>
mov    0x2d09(%rip),%rax
mov    (%rax),%edi
call   1030 <raise@plt>
mov    -0x48(%rbp),%rax
add    $0x7f800000,%rax
mov    %rax,-0x50(%rbp)
jmp    1301 <__mulsf3+0x1f1>
mov    -0x48(%rbp),%rax
mov    %rax,-0x50(%rbp)
jmp    131c <__mulsf3+0x20c>
mov    -0x48(%rbp),%rax
add    -0x58(%rbp),%rax
add    -0x38(%rbp),%rax
sub    $0x800000,%rax
mov    %rax,-0x50(%rbp)
jmp    1321 <__mulsf3+0x211>
movss  -0x50(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<__mulsf3>:
push   %rbx
sub    $0x10,%rsp
movd   %xmm0,0x8(%rsp)
movss  %xmm1,(%rsp)
mov    0x8(%rsp),%rcx
pxor   %xmm0,%xmm0
test   $0x7fffffff,%ecx
je     121d <__mulsf3+0x10d>
mov    (%rsp),%rsi
test   $0x7fffffff,%esi
je     121d <__mulsf3+0x10d>
mov    %ecx,%eax
shr    $0x8,%eax
movzwl %ax,%edi
or     $0x8000,%rdi
mov    %esi,%eax
shr    $0x8,%eax
movzwl %ax,%eax
or     $0x8000,%rax
mov    %rax,%r8
imul   %rdi,%r8
movzbl %cl,%ebx
imul   %rbx,%rax
mov    %rsi,%rdx
and    $0xff,%rdx
je     1193 <__mulsf3+0x83>
imul   %rdx,%rdi
add    %rdi,%rax
test   %rbx,%rbx
je     1193 <__mulsf3+0x83>
imul   %rbx,%rdx
shr    $0x8,%rdx
add    %rdx,%rax
sar    $0x8,%rax
add    %r8,%rax
mov    %esi,%ebx
xor    %ecx,%ebx
and    $0x80000000,%ebx
and    $0x7f800000,%ecx
and    $0x7f800000,%esi
add    %rcx,%rsi
xor    %edx,%edx
cmp    $0x7fffffff,%rax
setg   %dl
mov    $0x80000000,%ecx
cmp    %rcx,%rax
setl   %cl
shl    %cl,%rax
shl    $0x17,%rdx
lea    (%rdx,%rsi,1),%rcx
add    $0xffffffffc0800000,%rcx
cmp    $0x800000,%rcx
jl     1219 <__mulsf3+0x109>
cmp    $0x7f000001,%rcx
jb     1203 <__mulsf3+0xf3>
mov    0x2df4(%rip),%rax
mov    (%rax),%edi
call   1030 <raise@plt>
or     $0x7f800000,%ebx
jmp    1219 <__mulsf3+0x109>
shr    $0x7,%rax
add    $0x1,%rax
shr    %rax
add    %ebx,%ecx
lea    (%rax,%rcx,1),%ebx
add    $0xff800000,%ebx
movd   %ebx,%xmm0
add    $0x10,%rsp
pop    %rbx
ret

LLVM IR (-O0):
@SIGFPE = global i32 0
define float @__mulsf3(float %0, float %1) {
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
%14 = alloca i64
store float %0, float* %4
store float %1, float* %5
%15 = bitcast float* %4 to i64*
%16 = load i64, i64* %15
%17 = and i64 %16, 2147483647
%18 = icmp ne i64 %17, 0
br i1 %18, label %19, label %24
19: ; preds = %2
%20 = bitcast float* %5 to i64*
%21 = load i64, i64* %20
%22 = and i64 %21, 2147483647
%23 = icmp ne i64 %22, 0
br i1 %23, label %25, label %24
24: ; preds = %19, %2
store float 0.000000e+00, float* %3
br label %130
25: ; preds = %19
%26 = bitcast float* %4 to i64*
%27 = load i64, i64* %26
%28 = ashr i64 %27, 8
%29 = and i64 %28, 32767
%30 = or i64 %29, 32768
store i64 %30, i64* %6
%31 = bitcast float* %5 to i64*
%32 = load i64, i64* %31
%33 = ashr i64 %32, 8
%34 = and i64 %33, 32767
%35 = or i64 %34, 32768
store i64 %35, i64* %8
%36 = load i64, i64* %6
%37 = load i64, i64* %8
%38 = mul nsw i64 %36, %37
store i64 %38, i64* %10
%39 = bitcast float* %4 to i64*
%40 = load i64, i64* %39
%41 = and i64 %40, 255
store i64 %41, i64* %7
%42 = icmp ne i64 %41, 0
br i1 %42, label %43, label %47
43: ; preds = %25
%44 = load i64, i64* %8
%45 = load i64, i64* %7
%46 = mul nsw i64 %44, %45
store i64 %46, i64* %11
br label %48
47: ; preds = %25
store i64 0, i64* %11
br label %48
48: ; preds = %47, %43
%49 = bitcast float* %5 to i64*
%50 = load i64, i64* %49
%51 = and i64 %50, 255
store i64 %51, i64* %9
%52 = icmp ne i64 %51, 0
br i1 %52, label %53, label %69
53: ; preds = %48
%54 = load i64, i64* %6
%55 = load i64, i64* %9
%56 = mul nsw i64 %54, %55
%57 = load i64, i64* %11
%58 = add nsw i64 %57, %56
store i64 %58, i64* %11
%59 = load i64, i64* %7
%60 = icmp ne i64 %59, 0
br i1 %60, label %61, label %68
61: ; preds = %53
%62 = load i64, i64* %7
%63 = load i64, i64* %9
%64 = mul nsw i64 %62, %63
%65 = ashr i64 %64, 8
%66 = load i64, i64* %11
%67 = add nsw i64 %66, %65
store i64 %67, i64* %11
br label %68
68: ; preds = %61, %53
br label %69
69: ; preds = %68, %48
%70 = load i64, i64* %11
%71 = ashr i64 %70, 8
%72 = load i64, i64* %10
%73 = add nsw i64 %72, %71
store i64 %73, i64* %10
%74 = bitcast float* %4 to i64*
%75 = load i64, i64* %74
%76 = bitcast float* %5 to i64*
%77 = load i64, i64* %76
%78 = xor i64 %75, %77
%79 = and i64 %78, 2147483648
store i64 %79, i64* %12
%80 = bitcast float* %4 to i64*
%81 = load i64, i64* %80
%82 = and i64 %81, 2139095040
%83 = bitcast float* %5 to i64*
%84 = load i64, i64* %83
%85 = and i64 %84, 2139095040
%86 = add nsw i64 %82, %85
%87 = sub nsw i64 %86, 1065353216
store i64 %87, i64* %14
%88 = load i64, i64* %10
%89 = icmp sle i64 %88, 2147483647
br i1 %89, label %90, label %93
90: ; preds = %69
%91 = load i64, i64* %10
%92 = shl i64 %91, 1
store i64 %92, i64* %10
br label %96
93: ; preds = %69
%94 = load i64, i64* %14
%95 = add nsw i64 %94, 8388608
store i64 %95, i64* %14
br label %96
96: ; preds = %93, %90
%97 = load i64, i64* %10
%98 = ashr i64 %97, 7
%99 = add nsw i64 %98, 1
%100 = ashr i64 %99, 1
store i64 %100, i64* %10
%101 = load i64, i64* %14
%102 = icmp slt i64 %101, 8388608
br i1 %102, label %103, label %105
103: ; preds = %96
%104 = load i64, i64* %12
store i64 %104, i64* %13
br label %127
105: ; preds = %96
%106 = load i64, i64* %14
%107 = icmp sgt i64 %106, 2130706432
br i1 %107, label %108, label %119
108: ; preds = %105
%109 = load i64, i64* %14
%110 = icmp sle i64 %109, 3221225472
br i1 %110, label %111, label %116
111: ; preds = %108
%112 = load i32, i32* @SIGFPE
%113 = call i32 @raise(i32 %112)
%114 = load i64, i64* %12
%115 = add nsw i64 %114, 2139095040
store i64 %115, i64* %13
br label %118
116: ; preds = %108
%117 = load i64, i64* %12
store i64 %117, i64* %13
br label %118
118: ; preds = %116, %111
br label %126
119: ; preds = %105
%120 = load i64, i64* %12
%121 = load i64, i64* %14
%122 = add nsw i64 %120, %121
%123 = load i64, i64* %10
%124 = add nsw i64 %122, %123
%125 = sub nsw i64 %124, 8388608
store i64 %125, i64* %13
br label %126
126: ; preds = %119, %118
br label %127
127: ; preds = %126, %103
%128 = bitcast i64* %13 to float*
%129 = load float, float* %128
store float %129, float* %3
br label %130
130: ; preds = %127, %24
%131 = load float, float* %3
ret float %131
}

LLVM IR (-O2):
@SIGFPE = global i32 0
define float @__mulsf3(float %0, float %1) {
%3 = alloca float
%4 = alloca float
store float %0, float* %3
store float %1, float* %4
%5 = bitcast float* %3 to i64*
%6 = load i64, i64* %5
%7 = and i64 %6, 2147483647
%8 = icmp eq i64 %7, 0
br i1 %8, label %69, label %9
9: ; preds = %2
%10 = bitcast float* %4 to i64*
%11 = load i64, i64* %10
%12 = and i64 %11, 2147483647
%13 = icmp eq i64 %12, 0
br i1 %13, label %69, label %14
14: ; preds = %9
%15 = lshr i64 %6, 8
%16 = and i64 %15, 32767
%17 = or i64 %16, 32768
%18 = lshr i64 %11, 8
%19 = and i64 %18, 32767
%20 = or i64 %19, 32768
%21 = mul nuw nsw i64 %20, %17
%22 = and i64 %6, 255
%23 = freeze i64 %20
%24 = mul nuw nsw i64 %23, %22
%25 = and i64 %11, 255
%26 = icmp eq i64 %25, 0
br i1 %26, label %35, label %27
27: ; preds = %14
%28 = icmp eq i64 %22, 0
%29 = mul nuw nsw i64 %25, %17
%30 = add nsw i64 %24, %29
br i1 %28, label %35, label %31
31: ; preds = %27
%32 = mul nuw nsw i64 %25, %22
%33 = lshr i64 %32, 8
%34 = add nsw i64 %30, %33
br label %35
35: ; preds = %27, %31, %14
%36 = phi i64 [ %34, %31 ], [ %30, %27 ], [ %24, %14 ]
%37 = ashr i64 %36, 8
%38 = add nsw i64 %37, %21
%39 = xor i64 %11, %6
%40 = trunc i64 %39 to i32
%41 = and i32 %40, -2147483648
%42 = and i64 %6, 2139095040
%43 = and i64 %11, 2139095040
%44 = add nuw nsw i64 %43, %42
%45 = icmp slt i64 %38, 2147483648
%46 = zext i1 %45 to i64
%47 = shl nsw i64 %38, %46
%48 = select i1 %45, i64 -1065353216, i64 -1056964608
%49 = add nsw i64 %44, %48
%50 = lshr i64 %47, 7
%51 = add nuw nsw i64 %50, 1
%52 = lshr i64 %51, 1
%53 = icmp slt i64 %49, 8388608
br i1 %53, label %66, label %54
54: ; preds = %35
%55 = icmp ugt i64 %49, 2130706432
br i1 %55, label %56, label %60
56: ; preds = %54
%57 = load i32, i32* @SIGFPE
%58 = tail call i32 @raise(i32 %57)
%59 = or i32 %41, 2139095040
br label %66
60: ; preds = %54
%61 = zext i32 %41 to i64
%62 = add nuw nsw i64 %49, %61
%63 = add nuw nsw i64 %62, %52
%64 = trunc i64 %63 to i32
%65 = add i32 %64, -8388608
br label %66
66: ; preds = %35, %60, %56
%67 = phi i32 [ %59, %56 ], [ %65, %60 ], [ %41, %35 ]
%68 = bitcast i32 %67 to float
br label %69
69: ; preds = %2, %9, %66
%70 = phi float [ %68, %66 ], [ 0.000000e+00, %9 ], [ 0.000000e+00, %2 ]
ret float %70
}