// File: /workspace/github_c_makefile_star2_O0/markdryan[P]subtilis/arch/arm32/arm_encode.c
// Function: prv_encode_directive
static void prv_encode_directive(void *user_data, subtilis_arm_op_t *op,
				 subtilis_error_t *err)
{
	uint32_t *dbl_ptr;
	size_t len;
	size_t i;
	subtilis_arm_encode_ud_t *ud = user_data;

	switch (op->type) {
	case SUBTILIS_ARM_OP_ALIGN:
		len = ud->bytes_written & (op->op.alignment - 1);
		if (len == 0)
			return;
		len = op->op.alignment - len;
		prv_ensure_code_size(ud, len, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return;
		for (i = 0; i < len; i++)
			ud->code[ud->bytes_written++] = 0;
		break;
	case SUBTILIS_ARM_OP_BYTE:
		prv_ensure_code_size(ud, 1, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return;
		ud->code[ud->bytes_written++] = op->op.byte;
		break;
	case SUBTILIS_ARM_OP_TWO_BYTE:
		prv_ensure_code_size(ud, 2, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return;
		*((uint16_t *)&ud->code[ud->bytes_written]) = op->op.two_bytes;
		ud->bytes_written += 2;
		break;
	case SUBTILIS_ARM_OP_FOUR_BYTE:
		prv_ensure_code_size(ud, 4, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return;
		*((uint32_t *)&ud->code[ud->bytes_written]) = op->op.four_bytes;
		ud->bytes_written += 4;
		break;
	case SUBTILIS_ARM_OP_DOUBLE:
		prv_ensure_code_size(ud, 8, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return;
		*((double *)&ud->code[ud->bytes_written]) = op->op.dbl;
		ud->bytes_written += 8;
		break;
	case SUBTILIS_ARM_OP_DOUBLER:
		prv_ensure_code_size(ud, 8, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return;
		dbl_ptr = (uint32_t *)&op->op.dbl;
		*((uint32_t *)&ud->code[ud->bytes_written]) = dbl_ptr[1];
		*((uint32_t *)&ud->code[ud->bytes_written + 4]) = dbl_ptr[0];
		ud->bytes_written += 8;
		break;
	case SUBTILIS_ARM_OP_FLOAT:
		prv_ensure_code_size(ud, 4, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return;
		dbl_ptr = (uint32_t *)&op->op.flt;
		*((uint32_t *)&ud->code[ud->bytes_written]) = *dbl_ptr;
		ud->bytes_written += 4;
		break;
	case SUBTILIS_ARM_OP_STRING:
		len = strlen(op->op.str) + 1;
		prv_ensure_code_size(ud, len, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return;
		strcpy((char *)&ud->code[ud->bytes_written], op->op.str);
		ud->bytes_written += len;
		break;
	default:
		subtilis_error_set_assertion_failed(err);
		return;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
addl $-0x2, %eax
movl %eax, %ecx
movq %rcx, -0x40(%rbp)
subl $0x7, %eax
ja 0x7e81a
movq -0x40(%rbp), %rax
leaq 0x2e6c1(%rip), %rcx     # 0xacbd0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x10(%rbp), %rcx
movl 0x8(%rcx), %ecx
subl $0x1, %ecx
movl %ecx, %ecx
andq %rcx, %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x7e53f
jmp 0x7e834
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
subq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x38(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x18(%rbp), %rdx
callq 0x7e150
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
je 0x7e56d
jmp 0x7e834
movq $0x0, -0x30(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x28(%rbp), %rax
jae 0x7e5ac
movq -0x38(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rdx
movq 0x30(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x30(%rdx)
movb $0x0, (%rax,%rcx)
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0x7e575
jmp 0x7e834
movq -0x38(%rbp), %rdi
movq -0x18(%rbp), %rdx
movl $0x1, %esi
callq 0x7e150
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
je 0x7e5d1
jmp 0x7e834
movq -0x10(%rbp), %rax
movb 0x8(%rax), %dl
movq -0x38(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rsi
movq 0x30(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x30(%rsi)
movb %dl, (%rax,%rcx)
jmp 0x7e834
movq -0x38(%rbp), %rdi
movq -0x18(%rbp), %rdx
movl $0x2, %esi
callq 0x7e150
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
je 0x7e61b
jmp 0x7e834
movq -0x10(%rbp), %rax
movw 0x8(%rax), %dx
movq -0x38(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
movq 0x30(%rcx), %rcx
movw %dx, (%rax,%rcx)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rcx
addq $0x2, %rcx
movq %rcx, 0x30(%rax)
jmp 0x7e834
movq -0x38(%rbp), %rdi
movq -0x18(%rbp), %rdx
movl $0x4, %esi
callq 0x7e150
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
je 0x7e66c
jmp 0x7e834
movq -0x10(%rbp), %rax
movl 0x8(%rax), %edx
movq -0x38(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
movq 0x30(%rcx), %rcx
movl %edx, (%rax,%rcx)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rcx
addq $0x4, %rcx
movq %rcx, 0x30(%rax)
jmp 0x7e834
movq -0x38(%rbp), %rdi
movq -0x18(%rbp), %rdx
movl $0x8, %esi
callq 0x7e150
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
je 0x7e6bb
jmp 0x7e834
movq -0x10(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x38(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
movq 0x30(%rcx), %rcx
movsd %xmm0, (%rax,%rcx)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rcx
addq $0x8, %rcx
movq %rcx, 0x30(%rax)
jmp 0x7e834
movq -0x38(%rbp), %rdi
movq -0x18(%rbp), %rdx
movl $0x8, %esi
callq 0x7e150
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
je 0x7e70e
jmp 0x7e834
movq -0x10(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movl 0x4(%rax), %edx
movq -0x38(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
movq 0x30(%rcx), %rcx
movl %edx, (%rax,%rcx)
movq -0x20(%rbp), %rax
movl (%rax), %edx
movq -0x38(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
movq 0x30(%rcx), %rcx
movl %edx, 0x4(%rax,%rcx)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rcx
addq $0x8, %rcx
movq %rcx, 0x30(%rax)
jmp 0x7e834
movq -0x38(%rbp), %rdi
movq -0x18(%rbp), %rdx
movl $0x4, %esi
callq 0x7e150
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
je 0x7e783
jmp 0x7e834
movq -0x10(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movl (%rax), %edx
movq -0x38(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
movq 0x30(%rcx), %rcx
movl %edx, (%rax,%rcx)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rcx
addq $0x4, %rcx
movq %rcx, 0x30(%rax)
jmp 0x7e834
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x120d0
addq $0x1, %rax
movq %rax, -0x28(%rbp)
movq -0x38(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x18(%rbp), %rdx
callq 0x7e150
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
je 0x7e7eb
jmp 0x7e834
movq -0x38(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x38(%rbp), %rax
addq 0x30(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x12060
movq -0x28(%rbp), %rcx
movq -0x38(%rbp), %rax
addq 0x30(%rax), %rcx
movq %rcx, 0x30(%rax)
jmp 0x7e834
movq -0x18(%rbp), %rdi
movl $0xf, %esi
leaq 0x2e606(%rip), %rdx     # 0xace30
movl $0x9a1, %ecx            # imm = 0x9A1
callq 0x158e0
addq $0x40, %rsp
popq %rbp
retq
nopw (%rax,%rax)