// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/frontend/semantics.c
// Function: expr_mul
static void _expr_mul(
	ParserContext *ctx,
	ParserASTNode *node
)  {
	assert(ctx);
	assert(node);

	#define	_CHECK	\
	{	\
		assert(node->nchilds == 2);	\
	}

	uint32_t node_type = node->type;

	switch (node_type) {
		case FE_NODE_EXPR_MUL:
		case FE_NODE_EXPR_DIV: {
			_CHECK
			ParserASTNode *node_oprd1 = node->childs[0];
			ParserASTNode *node_oprd2 = node->childs[1];
			_expr_unary(ctx, node_oprd1);
			_expr_unary(ctx, node_oprd2);

			const char *operator = NULL;
			if (node_type == FE_NODE_EXPR_MUL) {
				operator = "*";
			} else if (node_type == FE_NODE_EXPR_DIV) {
				operator = "/";
			} else {
				assert(0);
			}

			_check_expr_mul_operands(
				ctx, node, node_oprd1, node_oprd2, operator, true
			);

			FE_EXPR_AST_NODE_COPY_CONSTANT2(node, node_oprd1, node_oprd2);
			if (FE_EXPR_AST_NODE_GET_CONSTANT(node)) {
				_calc_binary_constexpr(ctx, node_type, node, node_oprd1, node_oprd2);
			}
			break;
		}
		case FE_NODE_EXPR_MOD: {
			_CHECK
			ParserASTNode *node_oprd1 = node->childs[0];
			ParserASTNode *node_oprd2 = node->childs[1];
			_expr_unary(ctx, node_oprd1);
			_expr_unary(ctx, node_oprd2);

			_check_expr_mod_operands(
				ctx, node, node_oprd1, node_oprd2, "%", true
			);

			FE_EXPR_AST_NODE_COPY_CONSTANT2(node, node_oprd1, node_oprd2);
			if (FE_EXPR_AST_NODE_GET_CONSTANT(node)) {
				_calc_binary_constexpr(ctx, node_type, node, node_oprd1, node_oprd2);
			}
			break;
		}
		default: {
			_expr_unary(ctx, node);
			break;
		}
	}

	#undef	_CHECK
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x57069
jmp 0x57088
leaq 0x254e6(%rip), %rdi     # 0x7c556
leaq 0x271d3(%rip), %rsi     # 0x7e24a
movl $0xf7f, %edx            # imm = 0xF7F
leaq 0x284dd(%rip), %rcx     # 0x7f560
callq 0x30a0
cmpq $0x0, -0x10(%rbp)
je 0x57091
jmp 0x570b0
leaq 0x1ef3b(%rip), %rdi     # 0x75fd3
leaq 0x271ab(%rip), %rsi     # 0x7e24a
movl $0xf80, %edx            # imm = 0xF80
leaq 0x284b5(%rip), %rcx     # 0x7f560
callq 0x30a0
movq -0x10(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x14(%rbp)
movl -0x14(%rbp), %eax
movl %eax, -0x44(%rbp)
addl $0xfffff150, %eax       # imm = 0xFFFFF150
subl $0x2, %eax
jb 0x570de
jmp 0x570cb
movl -0x44(%rbp), %eax
subl $0xeb2, %eax            # imm = 0xEB2
je 0x57203
jmp 0x572d3
movq -0x10(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x570ea
jmp 0x57109
leaq 0x27583(%rip), %rdi     # 0x7e674
leaq 0x27152(%rip), %rsi     # 0x7e24a
movl $0xf8c, %edx            # imm = 0xF8C
leaq 0x2845c(%rip), %rcx     # 0x7f560
callq 0x30a0
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x56220
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x56220
movq $0x0, -0x30(%rbp)
cmpl $0xeb0, -0x14(%rbp)     # imm = 0xEB0
jne 0x57160
leaq 0x1fee1(%rip), %rax     # 0x7703b
movq %rax, -0x30(%rbp)
jmp 0x57197
cmpl $0xeb1, -0x14(%rbp)     # imm = 0xEB1
jne 0x57176
leaq 0x2419e(%rip), %rax     # 0x7b30e
movq %rax, -0x30(%rbp)
jmp 0x57195
leaq 0x1b2de(%rip), %rdi     # 0x7245b
leaq 0x270c6(%rip), %rsi     # 0x7e24a
movl $0xf98, %edx            # imm = 0xF98
leaq 0x283d0(%rip), %rcx     # 0x7f560
callq 0x30a0
jmp 0x57197
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rcx
movq -0x30(%rbp), %r8
movl $0x1, %r9d
callq 0x51a50
movq -0x20(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0x70(%rcx)
movb %al, -0x45(%rbp)
je 0x571cf
movq -0x28(%rbp), %rax
movb 0x70(%rax), %al
movb %al, -0x45(%rbp)
movb -0x45(%rbp), %cl
movq -0x10(%rbp), %rax
andb $0x1, %cl
movb %cl, 0x70(%rax)
movq -0x10(%rbp), %rax
testb $0x1, 0x70(%rax)
je 0x571fe
movq -0x8(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x10(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x52e70
jmp 0x572e0
movq -0x10(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x5720f
jmp 0x5722e
leaq 0x2745e(%rip), %rdi     # 0x7e674
leaq 0x2702d(%rip), %rsi     # 0x7e24a
movl $0xfa6, %edx            # imm = 0xFA6
leaq 0x28337(%rip), %rcx     # 0x7f560
callq 0x30a0
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x8(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x56220
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rsi
callq 0x56220
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq -0x40(%rbp), %rcx
leaq 0x210f3(%rip), %r8      # 0x78371
movl $0x1, %r9d
callq 0x51c10
movq -0x38(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0x70(%rcx)
movb %al, -0x46(%rbp)
je 0x572a2
movq -0x40(%rbp), %rax
movb 0x70(%rax), %al
movb %al, -0x46(%rbp)
movb -0x46(%rbp), %cl
movq -0x10(%rbp), %rax
andb $0x1, %cl
movb %cl, 0x70(%rax)
movq -0x10(%rbp), %rax
testb $0x1, 0x70(%rax)
je 0x572d1
movq -0x8(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x10(%rbp), %rdx
movq -0x38(%rbp), %rcx
movq -0x40(%rbp), %r8
callq 0x52e70
jmp 0x572e0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x56220
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)