// File: xocoder[P]m_kcptun/vendor/kcp/ikcp.c
// Function: ikcp_create
ikcpcb* ikcp_create(IUINT32 conv, void *user)
{
	ikcpcb *kcp = (ikcpcb*)ikcp_malloc(sizeof(struct IKCPCB));
	if (kcp == NULL) return NULL;
	kcp->conv = conv;
	kcp->user = user;
	kcp->snd_una = 0;
	kcp->snd_nxt = 0;
	kcp->rcv_nxt = 0;
	kcp->ts_recent = 0;
	kcp->ts_lastack = 0;
	kcp->ts_probe = 0;
	kcp->probe_wait = 0;
	kcp->snd_wnd = IKCP_WND_SND;
	kcp->rcv_wnd = IKCP_WND_RCV;
	kcp->rmt_wnd = IKCP_WND_RCV;
	kcp->cwnd = 0;
	kcp->incr = 0;
	kcp->probe = 0;
	kcp->mtu = IKCP_MTU_DEF;
	kcp->mss = kcp->mtu - IKCP_OVERHEAD;
	kcp->stream = 0;

	kcp->buffer = (char*)ikcp_malloc((kcp->mtu + IKCP_OVERHEAD) * 3);
	if (kcp->buffer == NULL) {
		ikcp_free(kcp);
		return NULL;
	}

	iqueue_init(&kcp->snd_queue);
	iqueue_init(&kcp->rcv_queue);
	iqueue_init(&kcp->snd_buf);
	iqueue_init(&kcp->rcv_buf);
	kcp->nrcv_buf = 0;
	kcp->nsnd_buf = 0;
	kcp->nrcv_que = 0;
	kcp->nsnd_que = 0;
	kcp->state = 0;
	kcp->acklist = NULL;
	kcp->ackblock = 0;
	kcp->ackcount = 0;
	kcp->rx_srtt = 0;
	kcp->rx_rttval = 0;
	kcp->rx_rto = IKCP_RTO_DEF;
	kcp->rx_minrto = IKCP_RTO_MIN;
	kcp->current = 0;
	kcp->interval = IKCP_INTERVAL;
	kcp->ts_flush = IKCP_INTERVAL;
	kcp->nodelay = 0;
	kcp->updated = 0;
	kcp->logmask = 0;
	kcp->ssthresh = IKCP_THRESH_INIT;
	kcp->fastresend = 0;
	kcp->nocwnd = 0;
	kcp->xmit = 0;
	kcp->dead_link = IKCP_DEADLINK;
	kcp->output = NULL;
	kcp->writelog = NULL;

	return kcp;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movl %edi, -0xc(%rbp)
movq %rsi, -0x18(%rbp)
movl $0x108, %edi            # imm = 0x108
callq 0x3bd0
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x38c1
movq $0x0, -0x8(%rbp)
jmp 0x3bc3
movl -0xc(%rbp), %ecx
movq -0x20(%rbp), %rax
movl %ecx, (%rax)
movq -0x18(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0xd8(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x10(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x14(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x18(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x1c(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x20(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x74(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x78(%rax)
movq -0x20(%rbp), %rax
movl $0x20, 0x38(%rax)
movq -0x20(%rbp), %rax
movl $0x80, 0x3c(%rax)
movq -0x20(%rbp), %rax
movl $0x80, 0x40(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x44(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x80(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x48(%rax)
movq -0x20(%rbp), %rax
movl $0x578, 0x4(%rax)       # imm = 0x578
movq -0x20(%rbp), %rax
movl 0x4(%rax), %ecx
subl $0x18, %ecx
movq -0x20(%rbp), %rax
movl %ecx, 0x8(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0xf0(%rax)
movq -0x20(%rbp), %rax
movl 0x4(%rax), %eax
addl $0x18, %eax
imull $0x3, %eax, %eax
movl %eax, %eax
movl %eax, %edi
callq 0x3bd0
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0xe0(%rax)
movq -0x20(%rbp), %rax
cmpq $0x0, 0xe0(%rax)
jne 0x39dd
movq -0x20(%rbp), %rdi
callq 0x3c10
movq $0x0, -0x8(%rbp)
jmp 0x3bc3
movq -0x20(%rbp), %rcx
addq $0x88, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x88(%rax)
movq -0x20(%rbp), %rcx
addq $0x88, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x90(%rax)
movq -0x20(%rbp), %rcx
addq $0x98, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x98(%rax)
movq -0x20(%rbp), %rcx
addq $0x98, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0xa0(%rax)
movq -0x20(%rbp), %rcx
addq $0xa8, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0xa8(%rax)
movq -0x20(%rbp), %rcx
addq $0xa8, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0xb0(%rax)
movq -0x20(%rbp), %rcx
addq $0xb8, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0xb8(%rax)
movq -0x20(%rbp), %rcx
addq $0xb8, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0xc0(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x5c(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x60(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x64(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x68(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0xc(%rax)
movq -0x20(%rbp), %rax
movq $0x0, 0xc8(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0xd4(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0xd0(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x2c(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x28(%rax)
movq -0x20(%rbp), %rax
movl $0xc8, 0x30(%rax)
movq -0x20(%rbp), %rax
movl $0x64, 0x34(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x4c(%rax)
movq -0x20(%rbp), %rax
movl $0x64, 0x50(%rax)
movq -0x20(%rbp), %rax
movl $0x64, 0x54(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x6c(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x70(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0xf4(%rax)
movq -0x20(%rbp), %rax
movl $0x2, 0x24(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0xe8(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0xec(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x58(%rax)
movq -0x20(%rbp), %rax
movl $0x14, 0x7c(%rax)
movq -0x20(%rbp), %rax
movq $0x0, 0xf8(%rax)
movq -0x20(%rbp), %rax
movq $0x0, 0x100(%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x20, %rsp
popq %rbp
retq
nopl (%rax)