// File: /workspace/github_c_makefile_star2_O2/ArtifexSoftware[P]mujs/./regexp.c
// Function: compile
static void compile(Reprog *prog, Renode *node)
{
	Reinst *inst, *split, *jump;
	int i;

loop:
	if (!node)
		return;

	switch (node->type) {
	case P_CAT:
		compile(prog, node->x);
		node = node->y;
		goto loop;

	case P_ALT:
		split = emit(prog, I_SPLIT);
		compile(prog, node->x);
		jump = emit(prog, I_JUMP);
		compile(prog, node->y);
		split->x = split + 1;
		split->y = jump + 1;
		jump->x = prog->end;
		break;

	case P_REP:
		inst = NULL; /* silence compiler warning. assert(node->m > 0). */
		for (i = 0; i < node->m; ++i) {
			inst = prog->end;
			compile(prog, node->x);
		}
		if (node->m == node->n)
			break;
		if (node->n < REPINF) {
			for (i = node->m; i < node->n; ++i) {
				split = emit(prog, I_SPLIT);
				compile(prog, node->x);
				if (node->ng) {
					split->y = split + 1;
					split->x = prog->end;
				} else {
					split->x = split + 1;
					split->y = prog->end;
				}
			}
		} else if (node->m == 0) {
			split = emit(prog, I_SPLIT);
			compile(prog, node->x);
			jump = emit(prog, I_JUMP);
			if (node->ng) {
				split->y = split + 1;
				split->x = prog->end;
			} else {
				split->x = split + 1;
				split->y = prog->end;
			}
			jump->x = split;
		} else {
			split = emit(prog, I_SPLIT);
			if (node->ng) {
				split->y = inst;
				split->x = prog->end;
			} else {
				split->x = inst;
				split->y = prog->end;
			}
		}
		break;

	case P_BOL: emit(prog, I_BOL); break;
	case P_EOL: emit(prog, I_EOL); break;
	case P_WORD: emit(prog, I_WORD); break;
	case P_NWORD: emit(prog, I_NWORD); break;

	case P_PAR:
		inst = emit(prog, I_LPAR);
		inst->n = node->n;
		compile(prog, node->x);
		inst = emit(prog, I_RPAR);
		inst->n = node->n;
		break;
	case P_PLA:
		split = emit(prog, I_PLA);
		compile(prog, node->x);
		emit(prog, I_END);
		split->x = split + 1;
		split->y = prog->end;
		break;
	case P_NLA:
		split = emit(prog, I_NLA);
		compile(prog, node->x);
		emit(prog, I_END);
		split->x = split + 1;
		split->y = prog->end;
		break;

	case P_ANY:
		emit(prog, I_ANY);
		break;
	case P_CHAR:
		inst = emit(prog, I_CHAR);
		inst->c = (prog->flags & REG_ICASE) ? canon(node->c) : node->c;
		break;
	case P_CCLASS:
		inst = emit(prog, I_CCLASS);
		inst->cc = prog->cclass + node->cc;
		break;
	case P_NCCLASS:
		inst = emit(prog, I_NCCLASS);
		inst->cc = prog->cclass + node->cc;
		break;
	case P_REF:
		inst = emit(prog, I_REF);
		inst->n = node->n;
		break;
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %r14
movq %rdi, %rbx
leaq 0xc05e(%rip), %r15      # 0x2093c
testq %r14, %r14
je 0x14bc7
movzbl (%r14), %eax
cmpq $0xe, %rax
ja 0x14bc7
movslq (%r15,%rax,4), %rax
addq %r15, %rax
jmpq *%rax
movq 0x10(%r14), %rsi
movq %rbx, %rdi
callq 0x148c6
movq 0x18(%r14), %r14
jmp 0x148de
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movb $0xa, (%rax)
jmp 0x1495d
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movb $0xf, (%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%rax)
movups %xmm0, 0x10(%rax)
movb 0x3(%r14), %cl
movb %cl, 0x1(%rax)
movq 0x10(%r14), %rsi
movq %rbx, %rdi
callq 0x148c6
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movb $0x10, (%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%rax)
movups %xmm0, 0x10(%rax)
movb 0x3(%r14), %cl
movb %cl, 0x1(%rax)
jmp 0x14bc7
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movw $0x6, (%rax)
jmp 0x149e7
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movw $0xd, (%rax)
jmp 0x149e7
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movw $0xc, (%rax)
jmp 0x149e7
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movw $0x9, (%rax)
jmp 0x14ba9
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movw $0xb, (%rax)
jmp 0x149e7
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movw $0xe, (%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%rax)
movups %xmm0, 0x10(%rax)
jmp 0x14bc7
movq 0x8(%rbx), %r15
leaq 0x20(%r15), %r12
movq %r12, 0x8(%rbx)
movw $0x4, (%r15)
jmp 0x14a1d
movq 0x8(%rbx), %r15
leaq 0x20(%r15), %r12
movq %r12, 0x8(%rbx)
movw $0x3, (%r15)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%r15)
movups %xmm0, 0x10(%r15)
movq 0x10(%r14), %rsi
movq %rbx, %rdi
callq 0x148c6
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
andw $0x0, (%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%rax)
movups %xmm0, 0x10(%rax)
movq %r12, 0x10(%r15)
movq 0x8(%rbx), %rax
movq %rax, 0x18(%r15)
jmp 0x14bc7
movq 0x8(%rbx), %r15
leaq 0x20(%r15), %r12
movq %r12, 0x8(%rbx)
movw $0x2, (%r15)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%r15)
movups %xmm0, 0x10(%r15)
movq 0x10(%r14), %rsi
movq %rbx, %rdi
callq 0x148c6
movq 0x8(%rbx), %r13
leaq 0x20(%r13), %rbp
movq %rbp, 0x8(%rbx)
movw $0x1, (%r13)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%r13)
movups %xmm0, 0x10(%r13)
movq 0x18(%r14), %rsi
movq %rbx, %rdi
callq 0x148c6
movq %r12, 0x10(%r15)
movq %rbp, 0x18(%r15)
movq 0x8(%rbx), %rax
movq %rax, 0x10(%r13)
jmp 0x14bc7
xorl %r15d, %r15d
xorl %r12d, %r12d
movzbl 0x2(%r14), %ebp
cmpl %ebp, %r12d
jae 0x14af3
movq 0x8(%rbx), %r15
movq 0x10(%r14), %rsi
movq %rbx, %rdi
callq 0x148c6
incl %r12d
jmp 0x14ad4
movb 0x3(%r14), %al
cmpb %al, %bpl
je 0x14bc7
cmpb $-0x1, %al
je 0x14bd6
movzbl %al, %eax
cmpl %eax, %ebp
jae 0x14bc7
movq 0x8(%rbx), %r15
leaq 0x20(%r15), %r12
movq %r12, 0x8(%rbx)
movw $0x2, (%r15)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%r15)
movups %xmm0, 0x10(%r15)
movq 0x10(%r14), %rsi
movq %rbx, %rdi
callq 0x148c6
cmpb $0x0, 0x1(%r14)
movq 0x8(%rbx), %rax
movq %rax, %rcx
cmoveq %r12, %rcx
cmovneq %r12, %rax
movq %rcx, 0x10(%r15)
movq %rax, 0x18(%r15)
incl %ebp
movb 0x3(%r14), %al
jmp 0x14b08
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movw $0x7, (%rax)
leaq 0x4(%rax), %r15
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%rax)
movups %xmm0, 0x10(%rax)
testb $0x1, 0x18(%rbx)
movl 0x4(%r14), %eax
je 0x14b93
movl %eax, %edi
callq 0x1f076
movl %eax, (%r15)
jmp 0x14bc7
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movw $0x8, (%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%rax)
movups %xmm0, 0x10(%rax)
movslq 0x8(%r14), %rcx
imulq $0x108, %rcx, %rcx      # imm = 0x108
addq 0x10(%rbx), %rcx
movq %rcx, 0x8(%rax)
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq 0x8(%rbx), %r12
leaq 0x20(%r12), %r13
movq %r13, 0x8(%rbx)
movw $0x2, (%r12)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%r12)
movups %xmm0, 0x10(%r12)
testl %ebp, %ebp
je 0x14c14
cmpb $0x0, 0x1(%r14)
je 0x14c63
movq %r15, 0x18(%r12)
movq 0x8(%rbx), %rax
movq %rax, 0x10(%r12)
jmp 0x14bc7
movq 0x10(%r14), %rsi
movq %rbx, %rdi
callq 0x148c6
movq 0x8(%rbx), %rax
leaq 0x20(%rax), %rcx
movq %rcx, 0x8(%rbx)
movw $0x1, (%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x4(%rax)
movups %xmm0, 0x10(%rax)
cmpb $0x0, 0x1(%r14)
movq 0x8(%rbx), %rcx
movq %rcx, %rdx
cmoveq %r13, %rdx
cmovneq %r13, %rcx
movq %rdx, 0x10(%r12)
movq %rcx, 0x18(%r12)
movq %r12, 0x10(%rax)
jmp 0x14bc7
movq %r15, 0x10(%r12)
movq 0x8(%rbx), %rax
movq %rax, 0x18(%r12)
jmp 0x14bc7