// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/backend/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 BE_NODE_EXPR_MUL:
		case BE_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 == BE_NODE_EXPR_MUL) {
				operator = "*";
			} else if (node_type == BE_NODE_EXPR_DIV) {
				operator = "/";
			} else {
				assert(0);
			}

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

			BE_EXPR_AST_NODE_COPY_CONSTANT2(node, node_oprd1, node_oprd2);
			if (BE_EXPR_AST_NODE_GET_CONSTANT(node)) {
				_calc_binary_constexpr(ctx, node_type, node, node_oprd1, node_oprd2);
			}
			break;
		}
		case BE_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
			);

			BE_EXPR_AST_NODE_COPY_CONSTANT2(node, node_oprd1, node_oprd2);
			if (BE_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 0x559d9
jmp 0x559f8
leaq 0x2a781(%rip), %rdi     # 0x80161
leaq 0x2ce99(%rip), %rsi     # 0x82880
movl $0xb25, %edx            # imm = 0xB25
leaq 0x2de36(%rip), %rcx     # 0x83829
callq 0x30a0
cmpq $0x0, -0x10(%rbp)
je 0x55a01
jmp 0x55a20
leaq 0x20b54(%rip), %rdi     # 0x7655c
leaq 0x2ce71(%rip), %rsi     # 0x82880
movl $0xb26, %edx            # imm = 0xB26
leaq 0x2de0e(%rip), %rcx     # 0x83829
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 0x55a4e
jmp 0x55a3b
movl -0x44(%rbp), %eax
subl $0xeb2, %eax            # imm = 0xEB2
je 0x55b73
jmp 0x55c43
movq -0x10(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x55a5a
jmp 0x55a79
leaq 0x2d2e3(%rip), %rdi     # 0x82d44
leaq 0x2ce18(%rip), %rsi     # 0x82880
movl $0xb32, %edx            # imm = 0xB32
leaq 0x2ddb5(%rip), %rcx     # 0x83829
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 0x54cb0
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x54cb0
movq $0x0, -0x30(%rbp)
cmpl $0xeb0, -0x14(%rbp)     # imm = 0xEB0
jne 0x55ad0
leaq 0x29370(%rip), %rax     # 0x7ee3a
movq %rax, -0x30(%rbp)
jmp 0x55b07
cmpl $0xeb1, -0x14(%rbp)     # imm = 0xEB1
jne 0x55ae6
leaq 0x29390(%rip), %rax     # 0x7ee70
movq %rax, -0x30(%rbp)
jmp 0x55b05
leaq 0x1d96d(%rip), %rdi     # 0x7345a
leaq 0x2cd8c(%rip), %rsi     # 0x82880
movl $0xb3e, %edx            # imm = 0xB3E
leaq 0x2dd29(%rip), %rcx     # 0x83829
callq 0x30a0
jmp 0x55b07
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rcx
movq -0x30(%rbp), %r8
movl $0x1, %r9d
callq 0x58b50
movq -0x20(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0x70(%rcx)
movb %al, -0x45(%rbp)
je 0x55b3f
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 0x55b6e
movq -0x8(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x10(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x513e0
jmp 0x55c50
movq -0x10(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x55b7f
jmp 0x55b9e
leaq 0x2d1be(%rip), %rdi     # 0x82d44
leaq 0x2ccf3(%rip), %rsi     # 0x82880
movl $0xb4c, %edx            # imm = 0xB4C
leaq 0x2dc90(%rip), %rcx     # 0x83829
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 0x54cb0
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rsi
callq 0x54cb0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq -0x40(%rbp), %rcx
leaq 0x292b8(%rip), %r8      # 0x7eea6
movl $0x1, %r9d
callq 0x58d10
movq -0x38(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0x70(%rcx)
movb %al, -0x46(%rbp)
je 0x55c12
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 0x55c41
movq -0x8(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x10(%rbp), %rdx
movq -0x38(%rbp), %rcx
movq -0x40(%rbp), %r8
callq 0x513e0
jmp 0x55c50
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x54cb0
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)