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

    aSig = extractFloat32Frac( a );
    aExp = extractFloat32Exp( a );
    bSig = extractFloat32Frac( b );
    bExp = extractFloat32Exp( b );
    expDiff = aExp - bExp;
    aSig <<= 7;
    bSig <<= 7;
    if ( 0 < expDiff ) goto aExpBigger;
    if ( expDiff < 0 ) goto bExpBigger;
    if ( aExp == 0xFF ) {
        if (aSig | bSig) {
            return propagateFloat32NaN(a, b, status);
        }
        float_raise(float_flag_invalid, status);
        return float32_default_nan;
    }
    if ( aExp == 0 ) {
        aExp = 1;
        bExp = 1;
    }
    if ( bSig < aSig ) goto aBigger;
    if ( aSig < bSig ) goto bBigger;
    return packFloat32(status->float_rounding_mode == float_round_down, 0, 0);
 bExpBigger:
    if ( bExp == 0xFF ) {
        if (bSig) {
            return propagateFloat32NaN(a, b, status);
        }
        return packFloat32( zSign ^ 1, 0xFF, 0 );
    }
    if ( aExp == 0 ) {
        ++expDiff;
    }
    else {
        aSig |= 0x40000000;
    }
    shift32RightJamming( aSig, - expDiff, &aSig );
    bSig |= 0x40000000;
 bBigger:
    zSig = bSig - aSig;
    zExp = bExp;
    zSign ^= 1;
    goto normalizeRoundAndPack;
 aExpBigger:
    if ( aExp == 0xFF ) {
        if (aSig) {
            return propagateFloat32NaN(a, b, status);
        }
        return a;
    }
    if ( bExp == 0 ) {
        --expDiff;
    }
    else {
        bSig |= 0x40000000;
    }
    shift32RightJamming( bSig, expDiff, &bSig );
    aSig |= 0x40000000;
 aBigger:
    zSig = aSig - bSig;
    zExp = aExp;
 normalizeRoundAndPack:
    --zExp;
    return normalizeRoundAndPackFloat32(zSign, zExp, zSig, status);

}

// Assembly:
pushq %rbx
movq %rcx, %rax
movl %esi, %r9d
movl %edi, %ebx
shrl $0x17, %ebx
movl $0xff, %ecx
movl %ebx, %r11d
andl %ecx, %r11d
shrl $0x17, %esi
andl %ecx, %esi
movl %edi, %r10d
shll $0x7, %r10d
movl $0x3fffff80, %ecx       # imm = 0x3FFFFF80
andl %ecx, %r10d
movl %r9d, %r8d
shll $0x7, %r8d
andl %ecx, %r8d
movq %r11, %rcx
subq %rsi, %rcx
jle 0xb28c
cmpl $0xff, %r11d
jne 0xb2b8
testl %r10d, %r10d
je 0xb340
movl %r9d, %esi
movq %rax, %rdx
popq %rbx
jmp 0xaf64
js 0xb2c6
testb %bl, %bl
je 0xb321
movzbl %bl, %ecx
cmpl $0xff, %ecx
jne 0xb32c
orl %r10d, %r8d
jne 0xb280
orb $0x1, 0x2(%rax)
movl $0x7fc00000, %edi       # imm = 0x7FC00000
jmp 0xb340
testq %rsi, %rsi
je 0xb2e3
orl $0x40000000, %r8d       # imm = 0x40000000
jmp 0xb2e8
cmpl $0xff, %esi
jne 0xb344
testl %r8d, %r8d
jne 0xb280
notb %dl
movzbl %dl, %edi
shll $0x1f, %edi
orl $0x7f800000, %edi       # imm = 0x7F800000
jmp 0xb340
decq %rcx
je 0xb30f
cmpq $0x1f, %rcx
ja 0xb304
movl %r8d, %esi
shrl %cl, %esi
negb %cl
shll %cl, %r8d
xorl %ecx, %ecx
testl %r8d, %r8d
setne %cl
orl %esi, %ecx
jmp 0xb30c
xorl %ecx, %ecx
testl %r8d, %r8d
setne %cl
movl %ecx, %r8d
orl $0x40000000, %r10d      # imm = 0x40000000
subl %r8d, %r10d
movq %r11, %rsi
movl %r10d, %r8d
jmp 0xb39e
movl $0x1, %r11d
movl $0x1, %esi
cmpl %r10d, %r8d
jb 0xb316
ja 0xb398
xorl %edi, %edi
cmpb $0x1, 0x1(%rax)
sete %dil
shll $0x1f, %edi
movl %edi, %eax
popq %rbx
retq
leal 0x40000000(%r10), %r9d
xorl %edi, %edi
testq %r11, %r11
sete %dil
cmovel %r10d, %r9d
negq %rdi
subq %rcx, %rdi
je 0xb38e
cmpq $0x1f, %rdi
ja 0xb383
movl %r9d, %r10d
movl %edi, %ecx
shrl %cl, %r10d
negb %dil
movl %edi, %ecx
shll %cl, %r9d
xorl %ecx, %ecx
testl %r9d, %r9d
setne %cl
orl %r10d, %ecx
jmp 0xb38b
xorl %ecx, %ecx
testl %r9d, %r9d
setne %cl
movl %ecx, %r9d
orl $0x40000000, %r8d       # imm = 0x40000000
movl %r9d, %r10d
subl %r10d, %r8d
xorb $0x1, %dl
testl %r8d, %r8d
je 0xb3ac
bsrl %r8d, %ecx
xorl $0x1f, %ecx
jmp 0xb3b1
movl $0x20, %ecx
movl %ecx, %edi
subq %rdi, %rsi
decb %cl
shll %cl, %r8d
movzbl %dl, %edi
movl %r8d, %edx
movq %rax, %rcx
popq %rbx
jmp 0x9f46