
.code
; procedure exec_cpuid
; Signature: void exec_cpiud(uint32_t *regs)
exec_cpuid Proc
	push	rbx
	push	rcx
	push	rdx
	push	rdi
	
	mov	rdi,	rcx
	
	mov	eax,	[rdi]
	mov	ebx,	[rdi+4]
	mov	ecx,	[rdi+8]
	mov	edx,	[rdi+12]
	
	cpuid
	
	mov	[rdi],	eax
	mov	[rdi+4],	ebx
	mov	[rdi+8],	ecx
	mov	[rdi+12],	edx
	pop	rdi
	pop	rdx
	pop	rcx
	pop	rbx
	ret
exec_cpuid endp

; procedure cpu_rdtsc
; Signature: void cpu_rdtsc(uint64_t *result)
cpu_rdtsc Proc
	push	rdx
	rdtsc
	mov	[rcx],	eax
	mov	[rcx+4],	edx
	pop	rdx
	ret
cpu_rdtsc endp

; procedure busy_sse_loop
; Signature: void busy_sse_loop(int cycles)
busy_sse_loop Proc
	; save xmm6 & xmm7 into the shadow area, as Visual C++ 2008
	; expects that we don't touch them:
	movups	[rsp + 8],	xmm6
	movups	[rsp + 24],	xmm7

	xorps	xmm0,	xmm0
	xorps	xmm1,	xmm1
	xorps	xmm2,	xmm2
	xorps	xmm3,	xmm3
	xorps	xmm4,	xmm4
	xorps	xmm5,	xmm5
	xorps	xmm6,	xmm6
	xorps	xmm7,	xmm7
	; --
	align 16
bsLoop:
	; 0:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 1:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 2:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 3:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 4:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 5:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 6:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 7:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 8:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 9:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 10:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 11:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 12:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 13:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 14:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 15:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 16:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 17:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 18:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 19:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 20:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 21:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 22:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 23:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 24:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 25:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 26:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 27:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 28:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 29:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 30:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; 31:
	addps	xmm0,	xmm1
	addps	xmm1,	xmm2
	addps	xmm2,	xmm3
	addps	xmm3,	xmm4
	addps	xmm4,	xmm5
	addps	xmm5,	xmm6
	addps	xmm6,	xmm7
	addps	xmm7,	xmm0
	; ----------------------
	dec		ecx
	jnz		bsLoop

	; restore xmm6 & xmm7:
	movups	xmm6,	[rsp + 8]
	movups	xmm7,	[rsp + 24]
	ret
busy_sse_loop endp

END
