;//
;//	ucontext_x64.asm
;//
;//	ユーザーコンテキスト(System V互換)
;//
;//	CLiP - Common Library for P/ECE
;//	Copyright (C) 2016 Naoyuki Sawa
;//
;//	* Tue Nov 29 23:01:43 JST 2016 Naoyuki Sawa
;//	- 1st リリース。
;//	  ユーザーコンテキスト(System V互換)のWin64用の実装のうち、アセンブラで実装する必要が有る部分を当モジュールで実装しました。
;//	  詳細は、/clip/ucontext.cの同日のコメントを参照して下さい。
;//
_TEXT		segment
;//-----------------------------------------------------------------------------//
		public		getcontext
getcontext	proc
		;//rcx      := ucp
		;//[rsp+ 0] := retp
		;//[rsp+ 8] := rcx退避用	←16 byte aligned
		;//[rsp+16] := rdx退避用
		;//[rsp+24] := r8退避用
		;//[rsp+32] := r9退避用
		pop		rdx					;//rdx := retp = *rsp++
		mov		  qword ptr [rcx+ 24], rbx		;//ucp->uc_mcontext.rbx   := rbx
		mov		  qword ptr [rcx+ 32], rsi		;//ucp->uc_mcontext.rsi   := rsi
		mov		  qword ptr [rcx+ 40], rdi		;//ucp->uc_mcontext.rdi   := rdi
		mov		  qword ptr [rcx+ 48], rbp		;//ucp->uc_mcontext.rbp   := rbp
		mov		  qword ptr [rcx+ 56], rsp		;//ucp->uc_mcontext.rsp   := rsp
		mov		  qword ptr [rcx+ 64], rdx		;//ucp->uc_mcontext.rip   := retp
		mov		  qword ptr [rcx+ 72], r12		;//ucp->uc_mcontext.r12   := r12
		mov		  qword ptr [rcx+ 80], r13		;//ucp->uc_mcontext.r13   := r13
		mov		  qword ptr [rcx+ 88], r14		;//ucp->uc_mcontext.r14   := r14
		mov		  qword ptr [rcx+ 96], r15		;//ucp->uc_mcontext.r15   := r15
		movdqu		xmmword ptr [rcx+104], xmm6		;//ucp->uc_mcontext.xmm6  := xmm6	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+120], xmm7		;//ucp->uc_mcontext.xmm7  := xmm7	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+136], xmm8		;//ucp->uc_mcontext.xmm8  := xmm8	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+152], xmm9		;//ucp->uc_mcontext.xmm9  := xmm9	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+168], xmm10		;//ucp->uc_mcontext.xmm10 := xmm10	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+184], xmm11		;//ucp->uc_mcontext.xmm11 := xmm11	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+200], xmm12		;//ucp->uc_mcontext.xmm12 := xmm12	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+216], xmm13		;//ucp->uc_mcontext.xmm13 := xmm13	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+232], xmm14		;//ucp->uc_mcontext.xmm14 := xmm14	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+248], xmm15		;//ucp->uc_mcontext.xmm15 := xmm15	アライメントは保証されていないのでmovdqaは不可!!
		mov		rax, 0					;//rax := 0
		jmp		rdx					;//return 0
getcontext	endp
;//-----------------------------------------------------------------------------//
		public		setcontext
setcontext	proc
		;//rcx      := ucp
		;//[rsp+ 0] := retp
		;//[rsp+ 8] := rcx退避用	←16 byte aligned
		;//[rsp+16] := rdx退避用
		;//[rsp+24] := r8退避用
		;//[rsp+32] := r9退避用
		mov		rbx,     qword ptr [rcx+ 24]		;//rbx   := ucp->uc_mcontext.rbx
		mov		rsi,     qword ptr [rcx+ 32]		;//rsi   := ucp->uc_mcontext.rsi
		mov		rdi,     qword ptr [rcx+ 40]		;//rdi   := ucp->uc_mcontext.rdi
		mov		rbp,     qword ptr [rcx+ 48]		;//rbp   := ucp->uc_mcontext.rbp
		mov		rsp,     qword ptr [rcx+ 56]		;//rsp   := ucp->uc_mcontext.rsp
		mov		rdx,     qword ptr [rcx+ 64]		;//rdx   := ucp->uc_mcontext.rip
		mov		r12,     qword ptr [rcx+ 72]		;//r12   := ucp->uc_mcontext.r12
		mov		r13,     qword ptr [rcx+ 80]		;//r13   := ucp->uc_mcontext.r13
		mov		r14,     qword ptr [rcx+ 88]		;//r14   := ucp->uc_mcontext.r14
		mov		r15,     qword ptr [rcx+ 96]		;//r15   := ucp->uc_mcontext.r15
		movdqu		xmm6,  xmmword ptr [rcx+104]		;//xmm6  := ucp->uc_mcontext.xmm6	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm7,  xmmword ptr [rcx+120]		;//xmm7  := ucp->uc_mcontext.xmm7	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm8,  xmmword ptr [rcx+136]		;//xmm8  := ucp->uc_mcontext.xmm8	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm9,  xmmword ptr [rcx+152]		;//xmm9  := ucp->uc_mcontext.xmm9	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm10, xmmword ptr [rcx+168]		;//xmm10 := ucp->uc_mcontext.xmm10	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm11, xmmword ptr [rcx+184]		;//xmm11 := ucp->uc_mcontext.xmm11	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm12, xmmword ptr [rcx+200]		;//xmm12 := ucp->uc_mcontext.xmm12	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm13, xmmword ptr [rcx+216]		;//xmm13 := ucp->uc_mcontext.xmm13	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm14, xmmword ptr [rcx+232]		;//xmm14 := ucp->uc_mcontext.xmm14	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm15, xmmword ptr [rcx+248]		;//xmm15 := ucp->uc_mcontext.xmm15	アライメントは保証されていないのでmovdqaは不可!!
		mov		rax, 0					;//rax := 0
		jmp		rdx					;//return 0
setcontext	endp
;//-----------------------------------------------------------------------------//
		public		swapcontext
swapcontext	proc
		;//rcx      := oucp
		;//rdx      := ucp
		;//[rsp+ 0] := retp
		;//[rsp+ 8] := rcx退避用	←16 byte aligned
		;//[rsp+16] := rdx退避用
		;//[rsp+24] := r8退避用
		;//[rsp+32] := r9退避用
		pop		rax					;//rax := retp = *rsp++
		mov		  qword ptr [rcx+ 24], rbx		;//oucp->uc_mcontext.rbx   := rbx
		mov		  qword ptr [rcx+ 32], rsi		;//oucp->uc_mcontext.rsi   := rsi
		mov		  qword ptr [rcx+ 40], rdi		;//oucp->uc_mcontext.rdi   := rdi
		mov		  qword ptr [rcx+ 48], rbp		;//oucp->uc_mcontext.rbp   := rbp
		mov		  qword ptr [rcx+ 56], rsp		;//oucp->uc_mcontext.rsp   := rsp
		mov		  qword ptr [rcx+ 64], rax		;//oucp->uc_mcontext.rip   := retp
		mov		  qword ptr [rcx+ 72], r12		;//oucp->uc_mcontext.r12   := r12
		mov		  qword ptr [rcx+ 80], r13		;//oucp->uc_mcontext.r13   := r13
		mov		  qword ptr [rcx+ 88], r14		;//oucp->uc_mcontext.r14   := r14
		mov		  qword ptr [rcx+ 96], r15		;//oucp->uc_mcontext.r15   := r15
		movdqu		xmmword ptr [rcx+104], xmm6		;//oucp->uc_mcontext.xmm6  := xmm6	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+120], xmm7		;//oucp->uc_mcontext.xmm7  := xmm7	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+136], xmm8		;//oucp->uc_mcontext.xmm8  := xmm8	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+152], xmm9		;//oucp->uc_mcontext.xmm9  := xmm9	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+168], xmm10		;//oucp->uc_mcontext.xmm10 := xmm10	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+184], xmm11		;//oucp->uc_mcontext.xmm11 := xmm11	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+200], xmm12		;//oucp->uc_mcontext.xmm12 := xmm12	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+216], xmm13		;//oucp->uc_mcontext.xmm13 := xmm13	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+232], xmm14		;//oucp->uc_mcontext.xmm14 := xmm14	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmmword ptr [rcx+248], xmm15		;//oucp->uc_mcontext.xmm15 := xmm15	アライメントは保証されていないのでmovdqaは不可!!
		;//- - - - - - - - - - - - - - - - - - - - - - - - - - -;//
		mov		rbx,     qword ptr [rdx+ 24]		;//rbx   := ucp->uc_mcontext.rbx
		mov		rsi,     qword ptr [rdx+ 32]		;//rsi   := ucp->uc_mcontext.rsi
		mov		rdi,     qword ptr [rdx+ 40]		;//rdi   := ucp->uc_mcontext.rdi
		mov		rbp,     qword ptr [rdx+ 48]		;//rbp   := ucp->uc_mcontext.rbp
		mov		rsp,     qword ptr [rdx+ 56]		;//rsp   := ucp->uc_mcontext.rsp
		mov		rcx,     qword ptr [rdx+ 64]		;//rcx   := ucp->uc_mcontext.rip
		mov		r12,     qword ptr [rdx+ 72]		;//r12   := ucp->uc_mcontext.r12
		mov		r13,     qword ptr [rdx+ 80]		;//r13   := ucp->uc_mcontext.r13
		mov		r14,     qword ptr [rdx+ 88]		;//r14   := ucp->uc_mcontext.r14
		mov		r15,     qword ptr [rdx+ 96]		;//r15   := ucp->uc_mcontext.r15
		movdqu		xmm6,  xmmword ptr [rdx+104]		;//xmm6  := ucp->uc_mcontext.xmm6	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm7,  xmmword ptr [rdx+120]		;//xmm7  := ucp->uc_mcontext.xmm7	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm8,  xmmword ptr [rdx+136]		;//xmm8  := ucp->uc_mcontext.xmm8	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm9,  xmmword ptr [rdx+152]		;//xmm9  := ucp->uc_mcontext.xmm9	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm10, xmmword ptr [rdx+168]		;//xmm10 := ucp->uc_mcontext.xmm10	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm11, xmmword ptr [rdx+184]		;//xmm11 := ucp->uc_mcontext.xmm11	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm12, xmmword ptr [rdx+200]		;//xmm12 := ucp->uc_mcontext.xmm12	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm13, xmmword ptr [rdx+216]		;//xmm13 := ucp->uc_mcontext.xmm13	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm14, xmmword ptr [rdx+232]		;//xmm14 := ucp->uc_mcontext.xmm14	アライメントは保証されていないのでmovdqaは不可!!
		movdqu		xmm15, xmmword ptr [rdx+248]		;//xmm15 := ucp->uc_mcontext.xmm15	アライメントは保証されていないのでmovdqaは不可!!
		mov		rax, 0					;//rax := 0
		jmp		rcx					;//return 0
swapcontext	endp
;//-----------------------------------------------------------------------------//
_TEXT		ends
		end
