// File: /workspace/github_cpp_makefile_star2_O2/kelwinfc[P]ci4721-Fernandez-Gyomrey/src/AST/to_tac.cpp
// Function: AST_struct_access::gen_tac_lval(Tac*, int*)
opd *AST_struct_access::gen_tac_lval(Tac* t, int *sta_base){
    opd *din_base = value->gen_tac_lval(t, sta_base);
    if (union_access) {
        union_type *ud = (union_type*)types.types[ sym->getType() ];
        din_base = gen_tac_lval_disp(t, din_base, sta_base);
        opd *t1 = new opd(), *t2 = new opd((int)sym->index);
        t->append_quad(inst::CP, t1, din_base, new opd(ud->width - 4), "cargando identificador de tipo usado en el union");
        // TODO esto apunta a una instrucción que no existe.
        // se asume que justo después de calcular la posición del campo del struct está la siguiente instrucción que se debe ejecutar.
        t->append_quad(inst::IFEQ, new opd(0), t2, new opd(t->next_instruction() + 7, O_LABEL),
            "permitir la asignación por primera vez a una unión");
        t->append_quad(inst::IFEQ, t1, t2, new opd(t->next_instruction() + 7, O_LABEL),
            "validar que en caso estar actualizado el tipo usado, se mantiene");
        t->append_quad(inst::WRITE, new opd(0), 0, 0, "dirección relativa del string en la tabla \"Se trató de utilizar una propiedad no activa de la unión en (\"");
        t->append_quad(inst::WRITE, new opd(value->line), 0, 0, "número de línea del error");
        t->append_quad(inst::WRITE, new opd(62), 0, 0, "dirección relativa del string en la tabla \", \"");
        t->append_quad(inst::WRITE, new opd(value->column), 0, 0, "número de columna del error");
        t->append_quad(inst::WRITE, new opd(65), 0, 0, "dirección relativa del string en la tabla \")\"");
        t->append_quad(inst::CP, t2, din_base, new opd(ud->width - 4),
            "guardando nuevo identificador de tipo usado en el union");
    }
    *sta_base += sym->offset;
    return din_base;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x148, %rsp            # imm = 0x148
movq %rdx, %rbx
movq %rsi, %r12
movq %rdi, %r14
movq 0x48(%rdi), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movq %rax, %r15
cmpb $0x1, 0x78(%r14)
movq %rbx, 0x20(%rsp)
jne 0xe72b
movq 0x70(%r14), %rdi
callq 0x13f0c
cltq
leaq 0x2a087(%rip), %rcx     # 0x38408
movq (%rcx), %rcx
movq (%rcx,%rax,8), %rax
movq %rax, 0x18(%rsp)
movq %r12, %rdi
movq %r15, %rsi
movq %rbx, %rdx
callq 0xdd48
movq %rax, 0x10(%rsp)
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %rbp
movq %rax, %rdi
callq 0x18148
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %r15
movq 0x70(%r14), %rax
movl 0x40(%rax), %esi
pushq $0x2
popq %rdx
movq %r15, %rdi
callq 0x1815e
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %rbx
movq 0x18(%rsp), %rax
movl 0x28(%rax), %esi
addl $-0x4, %esi
pushq $0x2
popq %rdx
movq %rbx, %rdi
callq 0x1815e
leaq 0x16357(%rip), %rsi     # 0x2474f
leaq 0x128(%rsp), %rdi
leaq 0xf(%rsp), %rdx
callq 0x6d6c
leaq 0x128(%rsp), %r9
movq %r12, %rdi
xorl %esi, %esi
movq %rbp, %rdx
movq 0x10(%rsp), %rcx
movq %rbx, %r8
callq 0x212de
leaq 0x128(%rsp), %rdi
callq 0x65c8
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %r13
pushq $0x2
popq %rdx
movq %rax, %rdi
xorl %esi, %esi
callq 0x1815e
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %rbx
movq %r12, %rdi
callq 0x2138a
addl $0x7, %eax
pushq $0x6
popq %rdx
movq %rbx, %rdi
movl %eax, %esi
callq 0x1815e
leaq 0x1630a(%rip), %rsi     # 0x24780
leaq 0x108(%rsp), %rdi
leaq 0xf(%rsp), %rdx
callq 0x6d6c
pushq $0x18
popq %rsi
leaq 0x108(%rsp), %r9
movq %r12, %rdi
movq %r13, %rdx
movq %r15, %rcx
movq %rbx, %r8
callq 0x212de
leaq 0x108(%rsp), %rdi
callq 0x65c8
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %rbx
movq %r12, %rdi
callq 0x2138a
addl $0x7, %eax
pushq $0x6
popq %rdx
movq %rbx, %rdi
movl %eax, %esi
callq 0x1815e
leaq 0x162da(%rip), %rsi     # 0x247b5
leaq 0xe8(%rsp), %rdi
leaq 0xf(%rsp), %rdx
callq 0x6d6c
pushq $0x18
popq %rsi
leaq 0xe8(%rsp), %r9
movq %r12, %rdi
movq %rbp, %rdx
movq %r15, %rcx
movq %rbx, %r8
callq 0x212de
leaq 0xe8(%rsp), %rdi
callq 0x65c8
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %rbx
pushq $0x2
popq %rdx
movq %rax, %rdi
xorl %esi, %esi
callq 0x1815e
leaq 0x162c1(%rip), %rsi     # 0x247f6
leaq 0xc8(%rsp), %rdi
leaq 0xf(%rsp), %rdx
callq 0x6d6c
pushq $0xa
popq %rsi
leaq 0xc8(%rsp), %r9
movq %r12, %rdi
movq %rbx, %rdx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x212de
leaq 0xc8(%rsp), %rdi
callq 0x65c8
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %rbx
movq 0x48(%r14), %rax
movl 0x8(%rax), %esi
pushq $0x2
popq %rdx
movq %rbx, %rdi
callq 0x1815e
leaq 0x162d0(%rip), %rsi     # 0x24863
leaq 0xa8(%rsp), %rdi
leaq 0xf(%rsp), %rdx
callq 0x6d6c
pushq $0xa
popq %rsi
leaq 0xa8(%rsp), %r9
movq %r12, %rdi
movq %rbx, %rdx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x212de
leaq 0xa8(%rsp), %rdi
callq 0x65c8
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %rbx
pushq $0x3e
popq %rsi
pushq $0x2
popq %rdx
movq %rax, %rdi
callq 0x1815e
leaq 0x16292(%rip), %rsi     # 0x2487f
leaq 0x88(%rsp), %rdi
leaq 0xf(%rsp), %rdx
callq 0x6d6c
pushq $0xa
popq %rsi
leaq 0x88(%rsp), %r9
movq %r12, %rdi
movq %rbx, %rdx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x212de
leaq 0x88(%rsp), %rdi
callq 0x65c8
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %rbx
movq 0x48(%r14), %rax
movl 0xc(%rax), %esi
pushq $0x2
popq %rdx
movq %rbx, %rdi
callq 0x1815e
leaq 0x16264(%rip), %rsi     # 0x248af
leaq 0x68(%rsp), %rdi
leaq 0xf(%rsp), %rdx
callq 0x6d6c
pushq $0xa
popq %rsi
leaq 0x68(%rsp), %r9
movq %r12, %rdi
movq %rbx, %rdx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x212de
leaq 0x68(%rsp), %rdi
callq 0x65c8
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %rbx
pushq $0x41
popq %rsi
pushq $0x2
popq %rdx
movq %rax, %rdi
callq 0x1815e
leaq 0x16230(%rip), %rsi     # 0x248cc
leaq 0x48(%rsp), %rdi
leaq 0xf(%rsp), %rdx
callq 0x6d6c
pushq $0xa
popq %rsi
leaq 0x48(%rsp), %r9
movq %r12, %rdi
movq %rbx, %rdx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x212de
leaq 0x48(%rsp), %rdi
callq 0x65c8
pushq $0x18
popq %rdi
callq 0x62d0
movq %rax, %rbx
movq 0x18(%rsp), %rax
movl 0x28(%rax), %esi
addl $-0x4, %esi
pushq $0x2
popq %rdx
movq %rbx, %rdi
callq 0x1815e
leaq 0x16206(%rip), %rsi     # 0x248fb
leaq 0x28(%rsp), %rdi
leaq 0xf(%rsp), %rdx
callq 0x6d6c
leaq 0x28(%rsp), %r9
movq %r12, %rdi
xorl %esi, %esi
movq %r15, %rdx
movq 0x10(%rsp), %r15
movq %r15, %rcx
movq %rbx, %r8
callq 0x212de
leaq 0x28(%rsp), %rdi
callq 0x65c8
movq 0x70(%r14), %rax
movl 0x34(%rax), %eax
movq 0x20(%rsp), %rcx
addl %eax, (%rcx)
movq %r15, %rax
addq $0x148, %rsp            # imm = 0x148
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %r14
leaq 0x28(%rsp), %rdi
jmp 0xe7f4
jmp 0xe7fb
jmp 0xe81a
movq %rax, %r14
leaq 0x48(%rsp), %rdi
jmp 0xe7f4
jmp 0xe7fb
jmp 0xe81a
movq %rax, %r14
leaq 0x68(%rsp), %rdi
jmp 0xe7f4
jmp 0xe7fb
jmp 0xe81a
movq %rax, %r14
leaq 0x88(%rsp), %rdi
jmp 0xe7f4
jmp 0xe7fb
jmp 0xe81a
movq %rax, %r14
leaq 0xa8(%rsp), %rdi
jmp 0xe7f4
jmp 0xe7fb
jmp 0xe81a
movq %rax, %r14
leaq 0xc8(%rsp), %rdi
jmp 0xe7f4
jmp 0xe7fb
jmp 0xe81a
movq %rax, %r14
leaq 0xe8(%rsp), %rdi
jmp 0xe7f4
jmp 0xe7fb
movq %rax, %r14
leaq 0x108(%rsp), %rdi
jmp 0xe7f4
jmp 0xe7fb
movq %rax, %r14
pushq $0x18
popq %rsi
movq %r13, %rdi
jmp 0xe823
movq %rax, %r14
leaq 0x128(%rsp), %rdi
callq 0x65c8
jmp 0xe828
movq %rax, %r14
jmp 0xe828
jmp 0xe81a
movq %rax, %r14
pushq $0x18
popq %rsi
movq %r15, %rdi
jmp 0xe823
movq %rax, %r14
pushq $0x18
popq %rsi
movq %rbp, %rdi
jmp 0xe823
jmp 0xe81a
movq %rax, %r14
pushq $0x18
popq %rsi
movq %rbx, %rdi
callq 0x62e0
movq %r14, %rdi
callq 0x6530