asm {
/***********************************/
_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

/***********************************/
_MEMCOPY::
		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

/***********************************/
_MEMCOMPARE::
		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

/***********************************/
_BEQUAL::
		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		@@05
		BTS 	U64 [RBX], RCX
		JMP 	@@10
@@05:	BTR 	U64 [RBX], RCX
@@10: 	ADC 	AL,  0
		POP 	RBP
		RET1	24

/***********************************/
_LBEQUAL::
		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		@@05
		LOCK
		BTS 	U64 [RBX], RCX
		JMP 	@@10
@@05:	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_EXT_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

/***********************************/
_ENDIAN_U16::
		PUSH	RBP
		MOV 	RBP, RSP
		MOVZX 	RAX, U16 SF_ARG1[RBP]
		XCHG	AL, AH
		POP 	RBP
		RET1	8

/***********************************/
_ENDIAN_U32::
		PUSH	RBP
		MOV 	RBP, RSP
		MOV 	RAX, SF_ARG1[RBP]
		BSWAP 	EAX
		POP 	RBP
		RET1	8

/***********************************/
_ENDIAN_U64::
		PUSH	RBP
		MOV 	RBP, RSP
		MOV 	RAX, SF_ARG1[RBP]
		BSWAP 	RAX
		POP 	RBP
		RET1	8

/***********************************/
_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

/***********************************/
_CALL_IND:: 		//See $LK,"_LAST_FUN",A="MN:_LAST_FUN"$
		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: 	MOV 	RCX, U64 SF_ARG2[RBP] //argc
		SHL 	RCX, 3
		ADD 	RSP, RCX
		XOR 	RAX, RAX
		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: 	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.exe_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

/***********************************/
_MSR_READ::
		PUSH	RBP
		MOV		RBP, RSP
		MOV		RCX, SF_ARG1[RBP]
		RDMSR
		SHL		RDX, 32
		MOV		EDX, EAX
		MOV		RAX, RDX
		POP		RBP
		RET1	8

/***********************************/
_MSR_WRITE::
		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
};
