// File: /workspace/github_c_makefile_star2_O1/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 0xb1ed
cmpl $0xff, %r11d
jne 0xb219
testl %r10d, %r10d
je 0xb2a6
movl %r9d, %esi
movq %rax, %rdx
popq %rbx
jmp 0xaeae
js 0xb24c
testb %bl, %bl
je 0xb287
movzbl %bl, %ecx
cmpl $0xff, %ecx
jne 0xb292
orl %r10d, %r8d
jne 0xb1e1
orb $0x1, 0x2(%rax)
movl $0x7fc00000, %edi       # imm = 0x7FC00000
jmp 0xb2a6
leal 0x40000000(%r8), %edi
xorl %r9d, %r9d
testq %rsi, %rsi
sete %r9b
cmovel %r8d, %edi
subq %r9, %rcx
je 0xb272
cmpq $0x1f, %rcx
jg 0xb269
movl %edi, %esi
shrl %cl, %esi
negb %cl
shll %cl, %edi
xorl %ecx, %ecx
testl %edi, %edi
setne %cl
orl %esi, %ecx
jmp 0xb270
cmpl $0xff, %esi
jne 0xb2aa
testl %r8d, %r8d
jne 0xb1e1
notb %dl
movzbl %dl, %edi
shll $0x1f, %edi
orl $0x7f800000, %edi       # imm = 0x7F800000
jmp 0xb2a6
xorl %ecx, %ecx
testl %edi, %edi
setne %cl
movl %ecx, %edi
orl $0x40000000, %r10d      # imm = 0x40000000
movl %edi, %r8d
subl %r8d, %r10d
movq %r11, %rsi
movl %r10d, %r8d
jmp 0xb304
movl $0x1, %r11d
movl $0x1, %esi
cmpl %r10d, %r8d
jb 0xb27c
ja 0xb2fe
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 0xb2f4
cmpq $0x1f, %rdi
jg 0xb2e9
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 0xb2f1
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 0xb312
bsrl %r8d, %ecx
xorl $0x1f, %ecx
jmp 0xb317
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 0x9e9b