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

    aSig = extractFloat64Frac( a );
    aExp = extractFloat64Exp( a );
    bSig = extractFloat64Frac( b );
    bExp = extractFloat64Exp( b );
    expDiff = aExp - bExp;
    aSig <<= 9;
    bSig <<= 9;
    if ( 0 < expDiff ) {
        if ( aExp == 0x7FF ) {
            if (aSig) {
                return propagateFloat64NaN(a, b, status);
            }
            return a;
        }
        if ( bExp == 0 ) {
            --expDiff;
        }
        else {
            bSig |= LIT64( 0x2000000000000000 );
        }
        shift64RightJamming( bSig, expDiff, &bSig );
        zExp = aExp;
    }
    else if ( expDiff < 0 ) {
        if ( bExp == 0x7FF ) {
            if (bSig) {
                return propagateFloat64NaN(a, b, status);
            }
            return packFloat64( zSign, 0x7FF, 0 );
        }
        if ( aExp == 0 ) {
            ++expDiff;
        }
        else {
            aSig |= LIT64( 0x2000000000000000 );
        }
        shift64RightJamming( aSig, - expDiff, &aSig );
        zExp = bExp;
    }
    else {
        if ( aExp == 0x7FF ) {
            if (aSig | bSig) {
                return propagateFloat64NaN(a, b, status);
            }
            return a;
        }
        if ( aExp == 0 ) {
            if (status->flush_to_zero) {
                if (aSig | bSig) {
                    float_raise(float_flag_output_denormal, status);
                }
                return packFloat64(zSign, 0, 0);
            }
            return packFloat64( zSign, 0, ( aSig + bSig )>>9 );
        }
        zSig = LIT64( 0x4000000000000000 ) + aSig + bSig;
        zExp = aExp;
        goto roundAndPack;
    }
    aSig |= LIT64( 0x2000000000000000 );
    zSig = ( aSig + bSig )<<1;
    --zExp;
    if ( (int64_t) zSig < 0 ) {
        zSig = aSig + bSig;
        ++zExp;
    }
 roundAndPack:
    return roundAndPackFloat64(zSign, zExp, zSig, status);

}

// Assembly:
pushq %rbx
movq %rcx, %rax
movq %rsi, %rcx
movabsq $0x2000000000000000, %r11 # imm = 0x2000000000000000
movq %rdi, %rsi
shrq $0x34, %rsi
movl $0x7ff, %r8d            # imm = 0x7FF
andq %r8, %rsi
movq %rcx, %rbx
shrq $0x34, %rbx
andq %r8, %rbx
movq %rdi, %r10
shlq $0x9, %r10
leaq -0x200(%r11), %r9
andq %r9, %r10
movq %rcx, %r8
shlq $0x9, %r8
andq %r9, %r8
movq %rsi, %r9
subq %rbx, %r9
jle 0xdd61
cmpl $0x7ff, %esi            # imm = 0x7FF
jne 0xdd82
testq %r10, %r10
je 0xde60
movq %rcx, %rsi
movq %rax, %rdx
popq %rbx
jmp 0xdbdb
js 0xdd8c
testq %rsi, %rsi
je 0xddf0
cmpl $0x7ff, %esi            # imm = 0x7FF
jne 0xde08
orq %r10, %r8
jne 0xdd55
jmp 0xde60
testq %rbx, %rbx
je 0xddb2
orq %r11, %r8
jmp 0xddbb
cmpl $0x7ff, %ebx            # imm = 0x7FF
jne 0xde12
testq %r8, %r8
jne 0xdd55
movzbl %dl, %eax
shlq $0x3f, %rax
movabsq $0x7ff0000000000000, %rdi # imm = 0x7FF0000000000000
orq %rax, %rdi
jmp 0xde60
decq %r9
je 0xde73
cmpq $0x3f, %r9
ja 0xdde0
movq %r8, %rdi
movl %r9d, %ecx
shrq %cl, %rdi
negb %r9b
movl %r9d, %ecx
shlq %cl, %r8
xorl %ecx, %ecx
testq %r8, %r8
setne %cl
orq %rdi, %rcx
jmp 0xdde8
xorl %ecx, %ecx
testq %r8, %r8
setne %cl
movq %rcx, %r8
jmp 0xde73
cmpb $0x0, 0x4(%rax)
je 0xde4f
orq %r10, %r8
je 0xddff
orb $-0x80, 0x2(%rax)
movzbl %dl, %edi
shlq $0x3f, %rdi
jmp 0xde60
addq %r10, %r8
btsq $0x3e, %r8
jmp 0xde8b
movq %r10, %rcx
orq %r11, %rcx
xorl %edi, %edi
testq %rsi, %rsi
sete %dil
cmovneq %rcx, %r10
addq %rdi, %r9
je 0xde70
movq %r9, %rcx
negq %rcx
cmpq $0x3f, %rcx
ja 0xde65
movq %r10, %rsi
shrq %cl, %rsi
movl %r9d, %ecx
shlq %cl, %r10
xorl %ecx, %ecx
testq %r10, %r10
setne %cl
orq %rsi, %rcx
jmp 0xde6d
addq %r10, %r8
shrq $0x9, %r8
movzbl %dl, %edi
shlq $0x3f, %rdi
orq %r8, %rdi
movq %rdi, %rax
popq %rbx
retq
xorl %ecx, %ecx
testq %r10, %r10
setne %cl
movq %rcx, %r10
movq %rbx, %rsi
orq %r11, %r10
addq %r8, %r10
xorl %ecx, %ecx
movq %r10, %r8
addq %r10, %r8
setns %cl
cmovsq %r10, %r8
subq %rcx, %rsi
movzbl %dl, %edi
movq %r8, %rdx
movq %rax, %rcx
popq %rbx
jmp 0xa25f