// File: /workspace/github_c_makefile_star2_O0/MaoKo[P]FGFX/fgfl/src/dfa_minimization.c
// Function: init_groups
static vector_t*
init_groups(lexical_spec_t* spec) {
    vector_t* groups = new_vector();
    bitset_t* non_final_group = new_bitset();

    //First select non final state 
    for (size_t i = 1; i < SIZE_VECTOR(spec->states); ++i) {
        dfa_state_t* crt_state = DFA_STATE_AT(spec, i);
        if (!crt_state->is_final)
            { ADD_BITSET(non_final_group, GET_INDEX(crt_state)); }
    }
    if (!is_empty_bitset(non_final_group))
        { PUSH_BACK_VECTOR(groups, non_final_group); }
    bitset_t* seen_final = new_bitset();
   
    //Second select final state
    for (size_t i = 1; i < SIZE_VECTOR(spec->states); ++i) {
        dfa_state_t* crt_state = DFA_STATE_AT(spec, i);
        if (!crt_state->is_final)
                { continue; }
        else if (IS_PRESENT(seen_final, GET_INDEX(crt_state)))
            { continue; }
        bitset_t* final_group = new_bitset();
 
        for (size_t j = i; j < SIZE_VECTOR(spec->states); ++j) {
            dfa_state_t* cmp_state = DFA_STATE_AT(spec, j);

            if ((cmp_state->final_anchor_entry == crt_state->final_anchor_entry)
                    && (cmp_state->final_entry == crt_state->final_entry)) {

                ADD_BITSET(final_group, GET_INDEX(cmp_state));
                ADD_BITSET(seen_final, GET_INDEX(cmp_state));

                cmp_state->group = SIZE_VECTOR(groups) + 1;
            }
        }
        PUSH_BACK_VECTOR(groups, final_group);
    }
    
    del_bitset(seen_final);
    return (groups);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
callq 0x1f00
movq %rax, -0x10(%rbp)
callq 0x12b0
movq %rax, -0x18(%rbp)
movq $0x1, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
movq 0x28(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jae 0x9803
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rax
movq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
testb $0x1, 0x22(%rax)
jne 0x97f0
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq -0x18(%rbp), %rcx
movl 0x4(%rcx), %ecx
cmpq %rcx, %rax
jb 0x97c2
movq -0x18(%rbp), %rdi
movq -0x28(%rbp), %rax
movq (%rax), %rsi
callq 0x1440
jmp 0x97f0
movq -0x28(%rbp), %rax
movq (%rax), %rcx
andq $0x3f, %rcx
movl $0x1, %edx
shlq %cl, %rdx
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rcx
shrq $0x6, %rcx
orq (%rax,%rcx,8), %rdx
movq %rdx, (%rax,%rcx,8)
jmp 0x97f2
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0x9766
movq -0x18(%rbp), %rdi
callq 0x16c0
testb $0x1, %al
jne 0x9825
movq -0x10(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x18(%rbp), %rdx
callq 0x2090
callq 0x12b0
movq %rax, -0x30(%rbp)
movq $0x1, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x8(%rbp), %rcx
movq 0x28(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jae 0x9a2b
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rax
movq -0x38(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
testb $0x1, 0x22(%rax)
jne 0x9872
jmp 0x9a1a
cmpq $0x0, -0x30(%rbp)
je 0x988c
movq -0x40(%rbp), %rax
movq (%rax), %rax
movq -0x30(%rbp), %rcx
movl 0x4(%rcx), %ecx
cmpq %rcx, %rax
jb 0x9894
xorl %eax, %eax
testb $0x1, %al
jne 0x98ca
jmp 0x98cf
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x40(%rbp), %rcx
movq (%rcx), %rcx
shrq $0x6, %rcx
movq (%rax,%rcx,8), %rax
movq -0x40(%rbp), %rcx
movq (%rcx), %rcx
andq $0x3f, %rcx
movl $0x1, %edx
shlq %cl, %rdx
movq %rdx, %rcx
andq %rcx, %rax
cmpq $0x0, %rax
je 0x98cf
jmp 0x9a1a
jmp 0x98d1
callq 0x12b0
movq %rax, -0x48(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
movq -0x8(%rbp), %rcx
movq 0x28(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jae 0x9a05
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rax
movq -0x50(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
movl 0x28(%rax), %eax
movq -0x40(%rbp), %rcx
cmpl 0x28(%rcx), %eax
jne 0x99f2
movq -0x58(%rbp), %rax
movl 0x24(%rax), %eax
movq -0x40(%rbp), %rcx
cmpl 0x24(%rcx), %eax
jne 0x99f2
movq -0x58(%rbp), %rax
movq (%rax), %rax
movq -0x48(%rbp), %rcx
movl 0x4(%rcx), %ecx
cmpq %rcx, %rax
jb 0x995c
movq -0x48(%rbp), %rdi
movq -0x58(%rbp), %rax
movq (%rax), %rsi
callq 0x1440
jmp 0x998a
movq -0x58(%rbp), %rax
movq (%rax), %rcx
andq $0x3f, %rcx
movl $0x1, %edx
shlq %cl, %rdx
movq -0x48(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x58(%rbp), %rcx
movq (%rcx), %rcx
shrq $0x6, %rcx
orq (%rax,%rcx,8), %rdx
movq %rdx, (%rax,%rcx,8)
movq -0x58(%rbp), %rax
movq (%rax), %rax
movq -0x30(%rbp), %rcx
movl 0x4(%rcx), %ecx
cmpq %rcx, %rax
jb 0x99af
movq -0x30(%rbp), %rdi
movq -0x58(%rbp), %rax
movq (%rax), %rsi
callq 0x1440
jmp 0x99dd
movq -0x58(%rbp), %rax
movq (%rax), %rcx
andq $0x3f, %rcx
movl $0x1, %edx
shlq %cl, %rdx
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x58(%rbp), %rcx
movq (%rcx), %rcx
shrq $0x6, %rcx
orq (%rax,%rcx,8), %rdx
movq %rdx, (%rax,%rcx,8)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
addq $0x1, %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x2c(%rax)
jmp 0x99f4
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x98e2
movq -0x10(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x48(%rbp), %rdx
callq 0x2090
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x9836
movq -0x30(%rbp), %rdi
callq 0x1320
movq -0x10(%rbp), %rax
addq $0x60, %rsp
popq %rbp
retq
nop