#define INSTR vmovapd
#define NINST 64
#define N edi
#define i r8d


.intel_syntax noprefix
.globl ninst
.data
ninst:
.long NINST
.align 32
PI:
.long  0xf01b866e, 0x400921f9, 0xf01b866e, 0x400921f9, 0xf01b866e, 0x400921f9, 0xf01b866e, 0x400921f9, 0xf01b866e, 0x400921f9, 0xf01b866e, 0x400921f9, 0xf01b866e, 0x400921f9, 0xf01b866e, 0x400921f9
.text
.globl latency
.type latency, @function
.align 32
latency:
		push      rbp
		mov       rbp, rsp
		xor       i, i
		test      N, N
		jle       done
		# create DP 1.0
		vpcmpeqw xmm0, xmm0, xmm0		# all ones
		vpsllq xmm0, xmm0, 54			# logical left shift: 11111110..0 (54=64-(10-1))
		vpsrlq xmm0, xmm0, 2			# logical right shift: 1 bit for sign; leading      mantissa bit is zero
		# expand from SSE to AVX
		vinsertf128 ymm0, ymm0, xmm0, 0x1
		# copy DP 1.0
		vmovaps ymm0, ymm0
		vmovaps ymm1, ymm0
		# Create DP 2.0
		vaddpd ymm1, ymm1, ymm1
		# Create DP 0.5
		vdivpd ymm2, ymm0, ymm1
loop:
		inc      i
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		INSTR    ymm0, ymm1
		INSTR    ymm1, ymm0
		cmp      i, N
		jl       loop
done:
		mov	rsp, rbp
		pop	rbp
		ret
.size latency, .-latency