// File: /workspace/github_c_makefile_star2_O2/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:
pushq %rbp
pushq %r14
pushq %rbx
movq %rdx, %rbx
movl %esi, %r14d
movq %rdx, %rsi
callq 0x91e7
movl %eax, %ebp
movl %r14d, %edi
movq %rbx, %rsi
callq 0x91e7
movl %eax, %esi
movl $0x7fffff, %edx         # imm = 0x7FFFFF
movl %ebp, %r8d
andl %edx, %r8d
movl %ebp, %r9d
shrl $0x17, %r9d
movl $0xff, %ecx
andl %ecx, %r9d
andl %eax, %edx
movl %eax, %edi
shrl $0x17, %edi
andl %ecx, %edi
xorl %ebp, %eax
cmpl %ecx, %r9d
jne 0xa8f4
testl %r8d, %r8d
jne 0xa904
cmpl $0xff, %edi
setne %cl
testl %edx, %edx
sete %r8b
orb %cl, %r8b
je 0xa904
orl %edx, %edi
jne 0xa9b3
orb $0x1, 0x2(%rbx)
movl $0x7fc00000, %eax       # imm = 0x7FC00000
jmp 0xa9c4
cmpl $0xff, %edi
jne 0xa912
testl %edx, %edx
je 0xa9aa
movl %ebp, %edi
movq %rbx, %rdx
popq %rbx
popq %r14
popq %rbp
jmp 0xa3b6
pushq $0x9
popq %rsi
testq %r9, %r9
jne 0xa93a
testl %r8d, %r8d
je 0xa9bf
bsrl %r8d, %r9d
xorl $0x1f, %r9d
leal -0x8(%r9), %ecx
shll %cl, %r8d
movl %esi, %ecx
subl %r9d, %ecx
movslq %ecx, %r9
testq %rdi, %rdi
jne 0xa953
testl %edx, %edx
je 0xa9bf
bsrl %edx, %edi
xorl $0x1f, %edi
leal -0x8(%rdi), %ecx
shll %cl, %edx
subl %edi, %esi
movslq %esi, %rdi
addq %r9, %rdi
shrl $0x1f, %eax
shll $0x7, %r8d
orl $0x40000000, %r8d       # imm = 0x40000000
shll $0x8, %edx
orl $0x80000000, %edx       # imm = 0x80000000
imulq %r8, %rdx
movq %rdx, %rcx
shrq $0x20, %rcx
xorl %r8d, %r8d
testl %edx, %edx
setne %r8b
orl %ecx, %r8d
xorl %esi, %esi
movl %r8d, %edx
addl %r8d, %edx
cmovsl %r8d, %edx
setns %sil
xorq $-0x7f, %rsi
addq %rdi, %rsi
movzbl %al, %edi
movq %rbx, %rcx
popq %rbx
popq %r14
popq %rbp
jmp 0x9421
orl %r8d, %r9d
je 0xa8e6
andl $0x80000000, %eax       # imm = 0x80000000
orl $0x7f800000, %eax       # imm = 0x7F800000
jmp 0xa9c4
andl $0x80000000, %eax       # imm = 0x80000000
popq %rbx
popq %r14
popq %rbp
retq