asm {
USE64
_MEMSET::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RDI
	CLD
	MOV	RDI,U64 SF_ARG1[RBP]
	MOV	RAX,U64 SF_ARG2[RBP]
	MOV	RCX,U64 SF_ARG3[RBP]
	REP_STOSB
	MOV	RAX,RDI
	POP	RDI
	POP	RBP
	RET1	24
_MEMSET_U16::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RDI
	CLD
	MOV	RDI,U64 SF_ARG1[RBP]
	MOV	RAX,U64 SF_ARG2[RBP]
	MOV	RCX,U64 SF_ARG3[RBP]
	REP_STOSW
	MOV	RAX,RDI
	POP	RDI
	POP	RBP
	RET1	24
_MEMSET_U32::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RDI
	CLD
	MOV	RDI,U64 SF_ARG1[RBP]
	MOV	RAX,U64 SF_ARG2[RBP]
	MOV	RCX,U64 SF_ARG3[RBP]
	REP_STOSD
	MOV	RAX,RDI
	POP	RDI
	POP	RBP
	RET1	24
_MEMSET_I64::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RDI
	CLD
	MOV	RDI,U64 SF_ARG1[RBP]
	MOV	RAX,U64 SF_ARG2[RBP]
	MOV	RCX,U64 SF_ARG3[RBP]
	REP_STOSQ
	MOV	RAX,RDI
	POP	RDI
	POP	RBP
	RET1	24
_MEMCPY::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RSI
	PUSH	RDI
	CLD
	MOV	RDI,U64 SF_ARG1[RBP]
	MOV	RSI,U64 SF_ARG2[RBP]
	MOV	RCX,U64 SF_ARG3[RBP]
	REP_MOVSB
	MOV	RAX,RDI
	POP	RDI
	POP	RSI
	POP	RBP
	RET1	24
_MEMCMP::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RSI
	PUSH	RDI
	CLD
	MOV	RSI,U64 SF_ARG1[RBP]
	MOV	RDI,U64 SF_ARG2[RBP]
	MOV	RCX,U64 SF_ARG3[RBP]
	XOR	RAX,RAX
	REPE_CMPSB
	JZ	@@05
	MOV	AL,1
	JA	@@05
	MOV	RAX,-1
@@05:	POP	RDI
	POP	RSI
	POP	RBP
	RET1	24
_BEQU::
	PUSH	RBP
	MOV	RBP,RSP
	XOR	RAX,RAX
	MOV	RDX,U64 SF_ARG3[RBP]
	MOV	RBX,U64 SF_ARG1[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	TEST	RDX,RDX
	JZ	@@5
	BTS	U64 [RBX],RCX
	JMP	@@10
@@5:	BTR	U64 [RBX],RCX
@@10:	ADC	AL,0
	POP	RBP
	RET1	24
_LBEQU::
	PUSH	RBP
	MOV	RBP,RSP
	XOR	RAX,RAX
	MOV	RDX,U64 SF_ARG3[RBP]
	MOV	RBX,U64 SF_ARG1[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	TEST	RDX,RDX
	JZ	@@5
	LOCK
	BTS	U64 [RBX],RCX
	JMP	@@10
@@5:	LOCK
	BTR	U64 [RBX],RCX
@@10:	ADC	AL,0
	POP	RBP
	RET1	24
_CLAMP_I64::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RAX,U64 SF_ARG1[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	MOV	RDX,U64 SF_ARG3[RBP]
	CMP	RAX,RCX
	CMOVL	RAX,RCX
	CMP	RAX,RDX
	CMOVG	RAX,RDX
	POP	RBP
	RET1	24
_CLAMP_U64::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RAX,U64 SF_ARG1[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	MOV	RDX,U64 SF_ARG3[RBP]
	CMP	RAX,RCX
	CMOVB	RAX,RCX
	CMP	RAX,RDX
	CMOVA	RAX,RDX
	POP	RBP
	RET1	24
_CALL::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RAX,U64 SF_ARG1[RBP]
	TEST	RAX,RAX
	JZ	@@05
	CALL	RAX
@@05:	POP	RBP
	RET1	8
_BIT_FIELD_OR_U32::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RBX,U64 SF_ARG2[RBP]
	SHR	RBX,3
	ADD	RBX,U64 SF_ARG1[RBP]
	MOV	RAX,U64 SF_ARG3[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	AND	CL,7
	SHL	RAX,CL
	OR	U64 [RBX],RAX
	POP	RBP
	RET1	24
_BIT_FIELD_EXTRACT_U32::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RBX,U64 SF_ARG2[RBP]
	MOV	RCX,RBX
	SHR	RBX,3
	ADD	RBX,U64 SF_ARG1[RBP]
	MOV	RDX,U64 [RBX]
	AND	CL,7
	SHR	RDX,CL
	MOV	RCX,U64 SF_ARG3[RBP]
	MOV	RAX,1
	SHL	RAX,CL
	DEC	RAX
	AND	RAX,RDX
	POP	RBP
	RET1	24
_XCHG_I64::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RDX,U64 SF_ARG1[RBP]
	MOV	RAX,U64 SF_ARG2[RBP]
	XCHG	U64 [RDX],RAX
	POP	RBP
	RET1	16
_XCHG_U32::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RDX,U64 SF_ARG1[RBP]
	MOV	EAX,U32 SF_ARG2[RBP]
	XCHG	U32 [RDX],EAX
	POP	RBP
	RET1	16
_XCHG_U16::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RDX,U64 SF_ARG1[RBP]
	MOVZX	RAX,U16 SF_ARG2[RBP]
	XCHG	U16 [RDX],AX
	POP	RBP
	RET1	16
_XCHG_U8::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RDX,U64 SF_ARG1[RBP]
	MOVZX	RAX,U8 SF_ARG2[RBP]
	XCHG	U8 [RDX],AL
	POP	RBP
	RET1	16

_LXCHG_I64::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RDX,U64 SF_ARG1[RBP]
	MOV	RAX,U64 SF_ARG2[RBP]
	LOCK
	XCHG	U64 [RDX],RAX
	POP	RBP
	RET1	16
_LXCHG_U32::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RDX,U64 SF_ARG1[RBP]
	MOV	EAX,U32 SF_ARG2[RBP]
	LOCK
	XCHG	U32 [RDX],EAX
	POP	RBP
	RET1	16
_LXCHG_U16::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RDX,U64 SF_ARG1[RBP]
	MOVZX	RAX,U16 SF_ARG2[RBP]
	LOCK
	XCHG	U16 [RDX],AX
	POP	RBP
	RET1	16
_LXCHG_U8::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RDX,U64 SF_ARG1[RBP]
	MOVZX	RAX,U8 SF_ARG2[RBP]
	LOCK
	XCHG	U8 [RDX],AL
	POP	RBP
	RET1	16
_REP_IN_U32::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RDI
	MOV	RDI,U64 SF_ARG1[RBP]
	MOV	RDX,U64 SF_ARG3[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	REP_INSD
	POP	RDI
	POP	RBP
	RET1	24
_REP_IN_U16::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RDI
	MOV	RDI,U64 SF_ARG1[RBP]
	MOV	RDX,U64 SF_ARG3[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	REP_INSW
	POP	RDI
	POP	RBP
	RET1	24
_REP_IN_U8::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RDI
	MOV	RDI,U64 SF_ARG1[RBP]
	MOV	RDX,U64 SF_ARG3[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	REP_INSB
	POP	RDI
	POP	RBP
	RET1	24
_REP_OUT_U32::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RSI
	MOV	RSI,U64 SF_ARG1[RBP]
	MOV	RDX,U64 SF_ARG3[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	REP_OUTSD
	POP	RSI
	POP	RBP
	RET1	24
_REP_OUT_U16::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RSI
	MOV	RSI,U64 SF_ARG1[RBP]
	MOV	RDX,U64 SF_ARG3[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	REP_OUTSW
	POP	RSI
	POP	RBP
	RET1	24
_REP_OUT_U8::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RSI
	MOV	RSI,U64 SF_ARG1[RBP]
	MOV	RDX,U64 SF_ARG3[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]
	REP_OUTSB
	POP	RSI
	POP	RBP
	RET1	24
_CPUID::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RSI
	MOV	RAX,U64 SF_ARG1[RBP]
	CPUID
	MOV	RSI,U64 SF_ARG2[RBP]
	MOV	U64 [RSI],RAX
	MOV	U64 8[RSI],RBX
	MOV	U64 16[RSI],RCX
	MOV	U64 24[RSI],RDX
	POP	RSI
	POP	RBP
	RET1	16
_CALLIND::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RSI
	PUSH	RDI
	MOV	RDX,U64 SF_ARG1[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]	//argc
	LEA	RSI,U64 SF_ARG3[RBP]	//argv
	SHL	RCX,3
	SUB	RSP,RCX
	MOV	RDI,RSP
	REP_MOVSB
	TEST	RDX,RDX
	JZ	@@05

	CALL	RDX
	POP	RDI
	POP	RSI
	POP	RBP
	RET

@@05:	XOR	RAX,RAX
	MOV	RCX,U64 SF_ARG2[RBP]	//argc
	SHL	RCX,3
	ADD	RSP,RCX
	POP	RDI
	POP	RSI
	POP	RBP
	RET
_CALLEXTNUM::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RSI
	PUSH	RDI
	MOV	RDX,U64 SF_ARG1[RBP]
	MOV	RCX,U64 SF_ARG2[RBP]	//argc
	LEA	RSI,U64 SF_ARG3[RBP]	//argv
	SHL	RCX,3
	SUB	RSP,RCX
	MOV	RDI,RSP
	REP_MOVSB
	MOV	RAX,U64 [SYS_EXTERN_TABLE]
	MOV	RAX,U64 [RAX+RDX*8]
	TEST	RAX,RAX
	JZ	@@05

	CALL	RAX
	POP	RDI
	POP	RSI
	POP	RBP
	RET

@@05:	XOR	RAX,RAX
	MOV	RCX,U64 SF_ARG2[RBP]	//argc
	SHL	RCX,3
	ADD	RSP,RCX
	POP	RDI
	POP	RSI
	POP	RBP
	RET
_CALLEXTSTR::
	PUSH	RBP
	MOV	RBP,RSP
	PUSH	RSI
	PUSH	RDI
	MOV	RCX,U64 SF_ARG2[RBP]	//argc
	LEA	RSI,U64 SF_ARG3[RBP]	//argv
	SHL	RCX,3
	SUB	RSP,RCX
	MOV	RDI,RSP
	REP_MOVSB
	MOV	RSI,U64 SF_ARG1[RBP]

	MOV	RCX,1
	XOR	RAX,RAX
	MOV	RDI,U64 FS:CTask.hash_table[RAX]
	MOV	RBX,HTT_FUN|HTT_EXPORT_SYS_SYM
	CALL	SYS_HASH_FIND
	JZ	@@15

	TEST	U32 CHash.type[RAX],HTT_FUN
	JZ	@@05
	MOV	RAX,U64 CHashFun.executable_addr[RAX]
	JMP	@@10
@@05:	MOV	RAX,U64 CHashExport.val[RAX]
@@10:	TEST	RAX,RAX
	JZ	@@15

	CALL	RAX
	POP	RDI
	POP	RSI
	POP	RBP
	RET

@@15:	MOV	RCX,U64 SF_ARG2[RBP]	//argc
	SHL	RCX,3
	ADD	RSP,RCX
	POP	RDI
	POP	RSI
	POP	RBP
	RET
SET_GS_BASE::
	PUSH	RAX
	PUSH	RCX
	PUSH	RDX
	MOV	RDX,RAX
	SHR	RDX,32
	MOV	ECX,IA32_GS_BASE
	WRMSR
	POP	RDX
	POP	RCX
	POP	RAX
	RET
SET_FS_BASE::
	PUSH	RAX
	PUSH	RCX
	PUSH	RDX
	MOV	RDX,RAX
	SHR	RDX,32
	MOV	ECX,IA32_FS_BASE
	WRMSR
	POP	RDX
	POP	RCX
	POP	RAX
_RET::
	RET
_SET_MSR::
	PUSH	RBP
	MOV	RBP,RSP
	MOV	RAX,SF_ARG2[RBP]
	MOV	RDX,RAX
	SHR	RDX,32
	MOV	RCX,SF_ARG1[RBP]
	WRMSR
	POP	RBP
	RET1	16
_SYS_HLT::
	CLI
@@05:	HLT
	JMP	@@05
}
