// File: /workspace/github_c_makefile_star2_O3/mbitsnbites[P]SoftFP/softfloat.c
// Function: float32_mul
float32 float32_mul(float32 a, float32 b, float_status *status)
{
    flag aSign, bSign, zSign;
    int_fast16_t aExp, bExp, zExp;
    uint32_t aSig, bSig;
    uint64_t zSig64;
    uint32_t zSig;

    a = float32_squash_input_denormal(a, status);
    b = float32_squash_input_denormal(b, status);

    aSig = extractFloat32Frac( a );
    aExp = extractFloat32Exp( a );
    aSign = extractFloat32Sign( a );
    bSig = extractFloat32Frac( b );
    bExp = extractFloat32Exp( b );
    bSign = extractFloat32Sign( b );
    zSign = aSign ^ bSign;
    if ( aExp == 0xFF ) {
        if ( aSig || ( ( bExp == 0xFF ) && bSig ) ) {
            return propagateFloat32NaN(a, b, status);
        }
        if ( ( bExp | bSig ) == 0 ) {
            float_raise(float_flag_invalid, status);
            return float32_default_nan;
        }
        return packFloat32( zSign, 0xFF, 0 );
    }
    if ( bExp == 0xFF ) {
        if (bSig) {
            return propagateFloat32NaN(a, b, status);
        }
        if ( ( aExp | aSig ) == 0 ) {
            float_raise(float_flag_invalid, status);
            return float32_default_nan;
        }
        return packFloat32( zSign, 0xFF, 0 );
    }
    if ( aExp == 0 ) {
        if ( aSig == 0 ) return packFloat32( zSign, 0, 0 );
        normalizeFloat32Subnormal( aSig, &aExp, &aSig );
    }
    if ( bExp == 0 ) {
        if ( bSig == 0 ) return packFloat32( zSign, 0, 0 );
        normalizeFloat32Subnormal( bSig, &bExp, &bSig );
    }
    zExp = aExp + bExp - 0x7F;
    aSig = ( aSig | 0x00800000 )<<7;
    bSig = ( bSig | 0x00800000 )<<8;
    shift64RightJamming( ( (uint64_t) aSig ) * bSig, 32, &zSig64 );
    zSig = zSig64;
    if ( 0 <= (int32_t) ( zSig<<1 ) ) {
        zSig <<= 1;
        --zExp;
    }
    return roundAndPackFloat32(zSign, zExp, zSig, status);

}

// Assembly:
movq %rdx, %r8
cmpb $0x0, 0x5(%rdx)
je 0xb47c
testl $0x7f800000, %edi       # imm = 0x7F800000
setne %al
testl $0x7fffff, %edi         # imm = 0x7FFFFF
sete %cl
orb %al, %cl
jne 0xb45b
orb $0x40, 0x2(%r8)
andl $0x80000000, %edi       # imm = 0x80000000
testl $0x7f800000, %esi       # imm = 0x7F800000
setne %al
testl $0x7fffff, %esi         # imm = 0x7FFFFF
sete %cl
orb %al, %cl
jne 0xb47c
orb $0x40, 0x2(%r8)
andl $0x80000000, %esi       # imm = 0x80000000
movl $0x7fffff, %edx         # imm = 0x7FFFFF
movl %edi, %r10d
andl %edx, %r10d
movl %edi, %r11d
shrl $0x17, %r11d
movl $0xff, %ecx
andl %ecx, %r11d
andl %esi, %edx
movl %esi, %r9d
shrl $0x17, %r9d
andl %ecx, %r9d
movl %esi, %eax
xorl %edi, %eax
cmpl %ecx, %r11d
jne 0xb4d9
testl %r10d, %r10d
jne 0xb4ea
cmpl $0xff, %r9d
setne %cl
testl %edx, %edx
sete %r10b
orb %cl, %r10b
je 0xb4ea
orl %edx, %r9d
jne 0xb58c
orb $0x1, 0x2(%r8)
movl $0x7fc00000, %eax       # imm = 0x7FC00000
retq
cmpl $0xff, %r9d
jne 0xb4f2
testl %edx, %edx
je 0xb583
movq %r8, %rdx
jmp 0xaf64
testq %r11, %r11
jne 0xb517
testl %r10d, %r10d
je 0xb597
bsrl %r10d, %esi
xorl $0x1f, %esi
leal -0x8(%rsi), %ecx
shll %cl, %r10d
movl $0x9, %ecx
subl %esi, %ecx
movslq %ecx, %r11
testq %r9, %r9
jne 0xb535
testl %edx, %edx
je 0xb597
bsrl %edx, %esi
xorl $0x1f, %esi
leal -0x8(%rsi), %ecx
shll %cl, %edx
movl $0x9, %ecx
subl %esi, %ecx
movslq %ecx, %r9
addq %r11, %r9
shrl $0x1f, %eax
shll $0x7, %r10d
orl $0x40000000, %r10d      # imm = 0x40000000
shll $0x8, %edx
orl $0x80000000, %edx       # imm = 0x80000000
imulq %r10, %rdx
movq %rdx, %rcx
shrq $0x20, %rcx
xorl %edi, %edi
testl %edx, %edx
setne %dil
orl %ecx, %edi
xorl %esi, %esi
movl %edi, %edx
addl %edi, %edx
cmovsl %edi, %edx
setns %sil
xorq $-0x7f, %rsi
addq %r9, %rsi
movzbl %al, %edi
movq %r8, %rcx
jmp 0x9f46
orl %r10d, %r11d
je 0xb4ce
andl $0x80000000, %eax       # imm = 0x80000000
orl $0x7f800000, %eax       # imm = 0x7F800000
retq
andl $0x80000000, %eax       # imm = 0x80000000
retq