// File: /workspace/github_cpp_makefile_star2_O1/CobaltXII[P]cxcc/./semantic/semantic_analyzer.hpp
// Function: semantic_analyzer_t::expand_ast(expression_t*&)
void expand_ast(expression_t*& expression) {
		if (expression->type == et_indexing) {
			// Convert an indexing expression to an unary expression that
			// takes the value of the addition of the index to the array. For
			// example:
			//     x[y] -> *(x + y)
			expand_ast(expression->indexing.array);
			expand_ast(expression->indexing.index);
			expression_t* array = expression->indexing.array;
			expression_t* index = expression->indexing.index;
			expression = new expression_t(
				(unary_expression_t){
					new expression_t(
						(binary_expression_t){
							array,
							index,
							bi_addition
						},
						0, 0
					),
					un_value_of
				},
				0, 0
			);
			expression->return_type = {array->return_type.pointer_depth - 1};
		} else if (expression->type == et_function_call) {
			function_call_expression_t& expr = expression->function_call;
			for (int i = 0; i < expr.arguments.size(); i++) {
				expand_ast(expr.arguments[i]);
			}
		} else if (expression->type == et_binary) {
			expand_ast(expression->binary.left_operand);
			expand_ast(expression->binary.right_operand);
			if (expression->binary.binary_operator == bi_addition_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_addition}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_subtraction_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_subtraction}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_multiplication_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_multiplication}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_division_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_division}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_modulo_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_modulo}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_binary_and_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_binary_and}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_binary_or_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_binary_or}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_binary_xor_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_binary_xor}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_binary_left_shift_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_binary_left_shift}, 0, 0), bi_assignment}, 0, 0);
			} else if (expression->binary.binary_operator == bi_binary_right_shift_assignment) {
				expression = new expression_t((binary_expression_t){expression->binary.left_operand, new expression_t((binary_expression_t){expression->binary.left_operand, expression->binary.right_operand, bi_binary_right_shift}, 0, 0), bi_assignment}, 0, 0);
			}
			expression->return_type = expression->binary.left_operand->return_type;
		} else if (expression->type == et_unary) {
			expand_ast(expression->unary.operand);
		}
	}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
movq (%rbx), %r15
movl (%r15), %eax
cmpl $0x7, %eax
jne 0x15013
addq $0x108, %r15            # imm = 0x108
movq %r15, %rbx
jmp 0x14ffc
cmpl $0x4, %eax
je 0x15074
cmpl $0x6, %eax
je 0x151f7
cmpl $0x5, %eax
jne 0x154ff
movq 0xd8(%r15), %rsi
cmpq %rsi, 0xe0(%r15)
je 0x154ff
xorl %ebx, %ebx
xorl %r12d, %r12d
addq %rbx, %rsi
movq %r14, %rdi
callq 0x14fee
incq %r12
movq 0xd8(%r15), %rsi
movq 0xe0(%r15), %rax
subq %rsi, %rax
sarq $0x3, %rax
addq $0x8, %rbx
cmpq %r12, %rax
ja 0x15043
jmp 0x154ff
addq $0xa8, %r15
movq %r14, %rdi
movq %r15, %rsi
callq 0x14fee
movl $0xb0, %esi
addq (%rbx), %rsi
movq %r14, %rdi
callq 0x14fee
movq (%rbx), %rax
movq 0xa8(%rax), %r15
movq 0xb0(%rax), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movl $0x118, %edi            # imm = 0x118
callq 0x3270
leaq 0x30(%rax), %rcx
movq %rcx, 0x20(%rax)
xorl %ecx, %ecx
movq %rcx, 0x28(%rax)
movb %cl, 0x30(%rax)
leaq 0x58(%rax), %rdx
movq %rdx, 0x48(%rax)
movq %rcx, 0x50(%rax)
movb %cl, 0x58(%rax)
leaq 0x78(%rax), %rdx
movq %rdx, 0x68(%rax)
movq %rcx, 0x70(%rax)
movb %cl, 0x78(%rax)
movl $0x98, %edx
leaq (%rax,%rdx), %rsi
movq %rsi, 0x88(%rax)
movq %rcx, 0x90(%rax)
movb %cl, 0x98(%rax)
movl $0xc8, %esi
movq %rax, %rdi
addq %rsi, %rdi
movq %rdi, 0xb8(%rax)
movq %rcx, 0xc0(%rax)
movb %cl, 0xc8(%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0xd8(%rax)
movq %rcx, 0xe8(%rax)
movl $0x6, (%rax)
movq %r15, 0xf0(%rax)
movq %r12, 0xf8(%rax)
movl %ecx, 0x100(%rax)
leaq 0x30(%r14), %rdi
movups %xmm0, 0x10(%rax)
movq %rdi, 0x20(%r14)
movq %rcx, 0x28(%r14)
movb %cl, 0x30(%r14)
leaq 0x58(%r14), %rdi
movq %rdi, 0x48(%r14)
movq %rcx, 0x50(%r14)
movb %cl, 0x58(%r14)
leaq 0x78(%r14), %rdi
movq %rdi, 0x68(%r14)
movq %rcx, 0x70(%r14)
movb %cl, 0x78(%r14)
addq %r14, %rdx
movq %rdx, 0x88(%r14)
movq %rcx, 0x90(%r14)
movb %cl, 0x98(%r14)
movq %r14, %rdx
addq %rsi, %rdx
movq %rdx, 0xb8(%r14)
movq %rcx, 0xc0(%r14)
movb %cl, 0xc8(%r14)
movups %xmm0, 0xd8(%r14)
movq %rcx, 0xe8(%r14)
movl $0x7, (%r14)
movq %rax, 0x108(%r14)
movl %ecx, 0x110(%r14)
movups %xmm0, 0x10(%r14)
movq %r14, (%rbx)
movq 0x8(%r15), %rax
decq %rax
movq %rax, 0x8(%r14)
jmp 0x154ff
addq $0xf0, %r15
movq %r14, %rdi
movq %r15, %rsi
callq 0x14fee
movl $0xf8, %esi
addq (%rbx), %rsi
movq %r14, %rdi
callq 0x14fee
movq (%rbx), %r15
movl 0x100(%r15), %eax
addl $-0x6, %eax
cmpl $0x16, %eax
ja 0x154ed
leaq 0x3fd6(%rip), %rcx      # 0x1920c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movq 0xf0(%r15), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
xorl %ecx, %ecx
jmp 0x153be
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movq 0xf0(%r15), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movl $0x2, %ecx
jmp 0x153be
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movq 0xf0(%r15), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movl $0x13, %ecx
jmp 0x153be
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movq 0xf0(%r15), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movl $0x1, %ecx
jmp 0x153be
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movq 0xf0(%r15), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movl $0x14, %ecx
jmp 0x153be
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movq 0xf0(%r15), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movl $0x15, %ecx
jmp 0x153be
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movq 0xf0(%r15), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movl $0x3, %ecx
jmp 0x153be
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movq 0xf0(%r15), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movl $0x4, %ecx
jmp 0x153be
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movq 0xf0(%r15), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movl $0x1a, %ecx
jmp 0x153be
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movq %rax, %r14
movq 0xf0(%r15), %r12
movl $0x118, %edi            # imm = 0x118
callq 0x3270
movl $0x19, %ecx
movups 0xf0(%r15), %xmm1
leaq 0x30(%rax), %rdx
movq %rdx, 0x20(%rax)
xorl %edx, %edx
movq %rdx, 0x28(%rax)
movb %dl, 0x30(%rax)
leaq 0x58(%rax), %rsi
movq %rsi, 0x48(%rax)
movq %rdx, 0x50(%rax)
movb %dl, 0x58(%rax)
leaq 0x78(%rax), %rsi
movq %rsi, 0x68(%rax)
movq %rdx, 0x70(%rax)
movb %dl, 0x78(%rax)
movl $0x98, %esi
leaq (%rax,%rsi), %rdi
movq %rdi, 0x88(%rax)
movq %rdx, 0x90(%rax)
movb %dl, 0x98(%rax)
movl $0xc8, %edi
leaq (%rax,%rdi), %r8
movq %r8, 0xb8(%rax)
movq %rdx, 0xc0(%rax)
movb %dl, 0xc8(%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0xd8(%rax)
movq %rdx, 0xe8(%rax)
movl $0x6, %r8d
movl %r8d, (%rax)
movups %xmm1, 0xf0(%rax)
movl %ecx, 0x100(%rax)
leaq 0x30(%r14), %rcx
movups %xmm0, 0x10(%rax)
movq %rcx, 0x20(%r14)
movq %rdx, 0x28(%r14)
movb %dl, 0x30(%r14)
leaq 0x58(%r14), %rcx
movq %rcx, 0x48(%r14)
movq %rdx, 0x50(%r14)
movb %dl, 0x58(%r14)
leaq 0x78(%r14), %rcx
movq %rcx, 0x68(%r14)
movq %rdx, 0x70(%r14)
movb %dl, 0x78(%r14)
addq %r14, %rsi
movq %rsi, 0x88(%r14)
movq %rdx, 0x90(%r14)
movb %dl, 0x98(%r14)
addq %r14, %rdi
movq %rdi, 0xb8(%r14)
movq %rdx, 0xc0(%r14)
movb %dl, 0xc8(%r14)
movups %xmm0, 0xd8(%r14)
movq %rdx, 0xe8(%r14)
movl %r8d, (%r14)
movq %r12, 0xf0(%r14)
movq %rax, 0xf8(%r14)
movl $0x5, 0x100(%r14)
movups %xmm0, 0x10(%r14)
movq %r14, (%rbx)
movq (%rbx), %rax
movq 0xf0(%rax), %rcx
movq 0x8(%rcx), %rcx
movq %rcx, 0x8(%rax)
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
jmp 0x1551f
jmp 0x1551f
jmp 0x1551f
jmp 0x1551f
jmp 0x1551f
jmp 0x1551f
jmp 0x1551f
jmp 0x1551f
jmp 0x1551f
jmp 0x1551f
movq %rax, %rbx
movl $0x118, %esi            # imm = 0x118
movq %r14, %rdi
callq 0x3280
movq %rbx, %rdi
callq 0x33b0
nop