nb_kernel410_ia64_double.s

来自「最著名最快的分子模拟软件」· S 代码 · 共 1,133 行 · 第 1/2 页

S
1,133
字号
	}	{	.mmf		ldfd		shX = [shiftVPtr], 8		ldfd		PosX = [posPtr], 8		mov			FIY = f0	} ;;//	OUTER PROLOGUE 2	{	.mmf		setf.sig	f32 = NTI		ldfd		shY = [shiftVPtr], 8		nop			0x0	}	{	.mfi		ldfd		PosY = [posPtr], 8		nop			0x0		nop			0x0			} ;;	{	.mmf								ldfd		shZ = [shiftVPtr]		ldfd		PosZ = [posPtr]		mov			FIZ = f0	}	{	.mmi		ldfd		FShiftX = [FShiftIS], 8		ldfd		FActIX = [FActII], 8		shladd		VNBPtr = ggid, 3, VNB	} ;;//	OUTER PROLOGUE 4	{	.mmf			ldfd		FShiftY = [FShiftIS], 8		ldfd		FActIY = [FActII], 8		xma.l		f32 = f32, f33, fZero	}	{ 	.mmi		sub			InnerCnt = NJ1, NJ0, 1		ldfd		dVdASum = [dVdAIPtr]		shladd		VCPtr = ggid, 3, VC	} ;;//	OUTER PROLOGUE 5	{	.mmi		ldfd		FActIZ = [FActII], -16		ldfd		FShiftZ = [FShiftIS], -16		mov			NJ0 = NJ1	} ;;//	OUTER PROLOGUE 6	{	.mmf				ldfd		ICharge = [chargePtr], 8		ldfd		VNBTotal = [VNBPtr]		fadd		IX = shX, PosX	} ;;//	OUTER PROLOGUE 7	{	.mfi		ldfd		VCTotal = [VCPtr]		fadd		IY = shY, PosY		add			NN0 = 1, NN0	}	{	.mmi	(pCont)	ld4		NJ1 = [jindexPtr], 4		ldfd		isaI = [isaPtr], 4		//	This may seem strange, but we set the first stage of the		//	pipe to execute this way because setting pr.rot doesn't take		//	into account how much the predicates have rotated. If this is		//	the first time through, we cleared all the pipeline predicates		//	in the initialization. If not, flushing the pipeline set all		//	the pipeline predicates to 0		cmp.eq		pPipe[0], p0 = zero, zero	} ;;//	OUTER PROLOGUE 8	{	.mfi				cmp.lt		pCont, pDone = NN0, NN1		fadd		IZ = shZ, PosZ		mov		    ar.lc = InnerCnt	} ;;//	OUTER PROLOGUE 9	{	.mfi				getf.sig	NTI = f32		fmpy		IQ = ICharge, Facel		mov			ar.ec = PIPE_DEPTH	} ;;// 14 bundles in outer loop - still aligned.	//	The inner loop is a 6-stage pipeline. The serial sequence of float ops	//	is folded into a 17-cycle loop (17 * 2 = 34 float ops, one empty),     //  then divided	//	into 5 stages.innerLoop://	INNER LOOP 1	{	.mfi		(pPipe[2])	ldfd	C6[0] = [TypeJ[2]], 8	(pPipe[2])	fmpy	Charge[2] = Charge[2], isaJ[2]	(pPipe[0])	shladd	jnr3 = jnr, 1, jnr	}	//	We march through jjnr[] sequentially, so it's usually a good idea	//	to preload the next value. However, we don't want to do this if	//	(1) we're in the epilogue or (2) this is the last time through and	//	there are no more atoms to inspect. Thus, we keep track of the loop	//	trip and use the logic below to see if we should load ahead	.pred.rel "mutex", pCont, pDone	{	.mfi	(pCont)		cmp.ge	pJJNR, p0 = InnerCnt, zero	(pPipe[5])	fnma 	FScalar[2] = FijGB[1], RInv[4], FScalar[2] 	(pDone)		cmp.gt	pJJNR, p0 = InnerCnt, zero	} ;;//	INNER LOOP 2	{	.mfi		(pPipe[2])	ldfd	C12[0] = [TypeJ[2]]	(pPipe[2])	fmpy	isaJ[2] = isaJ[2], GBTabscale	(pPipe[0])	shladd	isaPtr = jnr, 3, INVSQRTA	}	{	.mfi	(pPipe[0])	shladd	posPtr = jnr3, 3, POSITION	(pPipe[5]) 	fma		dVdATmp = F[2], RT[3], Y[2]	(pPipe[0])	shladd	FActPtr[0] = jnr3, 3, FACTION	} ;;//	INNER LOOP 3	{	.mfi										(pPipe[0])	ldfd	JX = [posPtr], 8	(pPipe[1])	fma		RSqr[1] = DZ[1], DZ[1], RSqr[1]	(pPipe[0])	shladd  TypeJ[0] = jnr, 2, TYPE	}	{  	.mfi				nop		0x0	(pPipe[2])	fmpy	RInvErr[1] = RSqr[2], RInv[1]	(pPipe[0])	shladd  dVdAPtr[0] = jnr, 3, DVDA	} ;;//	INNER LOOP 4	{	.mfi		(pPipe[0])	ldfd	JY = [posPtr], 8	(pPipe[3])	fmpy	C6[1] = C6[1], RInv6[1]	(pPipe[1])	add		TypeJ[1] = NTI, TypeJ[1]		}	{	.mfi	(pPipe[3])	getf.sig nnn = n0[1]	(pPipe[3])	fcvt.xf n0[1] = n0[1]	(pPipe[0])	shladd	chargePtr = jnr, 3, CHARGE	} ;;//	INNER LOOP 5	{	.mfi										(pPipe[0])	ldfd	JZ = [posPtr], 8	(pPipe[2])	fmpy	RInvT[1] = fHALF, RInv[1]	(pPipe[0])	add	Ninner = 1, Ninner	}	{	.mfi	(pJJNR)		ld4		jnr = [jjnrPtr], 4	(pPipe[3])	fmpy	RInv6[1] = RInv6[1], RInv6[1]	(pPipe[0])	add		InnerCnt = -1, InnerCnt	} ;;//	INNER LOOP 6	{	.mfi										(pPipe[0])	ldfd	isaJ[0] = [isaPtr]	(pPipe[1])	fmpy	isaJ[1] = isaJ[1], isaI				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[4])	fma		G[1] = eps[1], H[1], G[1]				nop		0x0	} ;;//	INNER LOOP 7	{	.mfi										(pPipe[0])	ld4 	TypeJ[0] = [TypeJ[0]]				(pPipe[1])	frsqrta RInv[0], p0 = RSqr[1]	(pPipe[1])	shladd	TypeJ[1] = TypeJ[1], 4, NBFP	}	{	.mfi				nop		0x0	(pPipe[2])	fnma	RInvErr[1] = RInv[1], RInvErr[1], fOne	(pJJNR)     add     jjnrPtr = JJNR_PREFETCH_DISTANCE, jjnrPtr	} ;;//	INNER LOOP 8	{	.mfi										(pPipe[0])	ldfd	Charge[0] = [chargePtr]							(pPipe[2])	fmpy	Charge[2] = Charge[2], IQ				nop		0x0	}	{	.mfi				nop		0x0		(pPipe[5])	fnma	dVdAJ[3] = Charge[5], dVdATmp, dVdAJ[3]				nop		0x0	} ;;//	INNER LOOP 9	{	.mfi										(pPipe[2])	ldfd	FActX[0] = [FActPtr[2]], 8	(pPipe[3])	fnma	FScalar[0] = C6[1], fSIX, fZero				nop		0x0	}	{	.mfi	(pJJNR)     lfetch.nta  [jjnrPtr]	(pPipe[3])	fmpy	C12[1] = C12[1], RInv6[1]				nop		0x0	} ;;//	INNER LOOP 10	{	.mfi										(pPipe[2])	ldfd	FActY[0] = [FActPtr[2]], 8	(pPipe[5])	fnma	FActX[3] = FScalar[2], DX[5], FActX[3]		(pJJNR)     add     jjnrPtr = -JJNR_PREFETCH_DISTANCE, jjnrPtr	}	{	.mfi				nop		0x0	(pPipe[4])	fma		F[1] = eps[1], G[1], F[1]	(pPipe[3])	shladd	nnn = nnn, 2, zero	} ;;//	INNER LOOP 11	{	.mfi										(pPipe[2])	ldfd	FActZ[0] = [FActPtr[2]], -16	(pPipe[1])	fmpy	RInvErr[0] = RInv[0], RSqr[1]				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[2])	fma		RInv[1] = RInvT[1], RInvErr[1], RInv[1]	(pPipe[3])	shladd	nnn = nnn, 3, GBTab	} ;;//	INNER LOOP 12	{	.mfi										(pPipe[3])	ldfpd	Y[0], F[0] = [nnn], 16	(pPipe[3])	fsub	VNBTotal = VNBTotal, C6[1]							nop		0x0	}	{	.mfi				nop		0x0	(pPipe[4])	fma		G[1] = eps[1], H[1], G[1]				nop		0x0	} ;;//	INNER LOOP 13	{	.mfi										(pPipe[3])	ldfpd	G[0], H[0] = [nnn]	(pPipe[5])	fnma	FActY[3] = FScalar[2], DY[5], FActY[3]						nop		0x0	}	{	.mfi				nop		0x0	(pPipe[5])	fnma	FActZ[3] = FScalar[2], DZ[5], FActZ[3]					nop		0x0	} ;;//	INNER LOOP 14	{	.mfi										(pPipe[2])	ldfd	dVdAJ[0] = [dVdAPtr[2]]	(pPipe[3])	fma		FScalar[0] = C12[1], fTWELVE, FScalar[0]					nop		0x0	}	{	.mfi				nop		0x0	(pPipe[4])	fma     Y[1] = eps[1], F[1], Y[1]				nop		0x0	} ;;//	INNER LOOP 15	{	.mfi													nop		0x0	(pPipe[1])	fnma	RInvErr[0] = RInvErr[0], RInv[0], fOne				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[2])	fmpy	RInv2[0] = RInv[1], RInv[1]				nop		0x0	} ;;//	INNER LOOP 16	{	.mfi													nop		0x0	(pPipe[2])	fmpy	RInv[1] = RInv[1], isaJ[2]				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[4])	fma		F[1] = eps[1], G[1], F[1]				nop		0x0	} ;;//	INNER LOOP 17	{	.mfi													nop		0x0	(pPipe[0])	fsub	DX[0] = IX, DX[0]				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[5])	fma 	FIX = DX[5], FScalar[2], FIX				nop		0x0	} ;;//	INNER LOOP 18	{	.mfi													nop		0x0	(pPipe[0])	fsub	DY[0] = IY, DY[0]				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[5])	fma 	FIY = DY[5], FScalar[2], FIY				nop		0x0	} ;;//	INNER LOOP 19	{	.mfi													nop		0x0	(pPipe[0])	fsub	DZ[0] = IZ, DZ[0]				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[1])	fma		RInvT[0] = RInvErr[0], f3_8, fHALF				nop		0x0	} ;;//	INNER LOOP 20	{	.mfi													nop		0x0	(pPipe[1])	fmpy	RInvU[0] = RInv[0], RInvErr[0]				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[2])	fmpy	RT[0] =  RSqr[2], RInv[1] 				nop		0x0	} ;;//	INNER LOOP 21	{	.mfi													nop		0x0	(pPipe[0])	fmpy	RSqr[0] = DX[0], DX[0]				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[2])	fmpy	RInv6[0] = RInv2[0], RInv2[0]				nop		0x0	} ;;//	INNER LOOP 22	{	.mfi													nop		0x0	(pPipe[4])	fmpy	FijGB[0] = F[1], Charge[4]				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[5])	fma 	FIZ = DZ[5], FScalar[2], FIZ				nop		0x0	} ;;//	INNER LOOP 23	{	.mfi													nop		0x0	(pPipe[3])	fadd	VNBTotal = VNBTotal, C12[1]							nop		0x0	}	{	.mfi				nop		0x0	(pPipe[4])	fma	VCTotal = Y[1], Charge[4], VCTotal				nop		0x0	} ;;//	INNER LOOP 24	{	.mfi										(pPipe[5])	stfd	[dVdAPtr[5]] = dVdAJ[3]	(pPipe[1])	fma		RInv[0] = RInvU[0], RInvT[0], RInv[0]						nop		0x0	}	{	.mfi				nop		0x0	(pPipe[2])	fcvt.fx.trunc n0[0] = RT[0]				nop		0x0	} ;;//	INNER LOOP 25	{	.mfi										(pPipe[5])	stfd	[FActPtr[5]] = FActX[3], 8	(pPipe[3])	fmpy 	FScalar[0] =  FScalar[0], RInv2[1]					nop		0x0	}	{	.mfi				nop		0x0	(pPipe[0])	fma		RSqr[0] = DY[0], DY[0], RSqr[0]				nop		0x0	} ;;//	INNER LOOP 26	{	.mfi										(pPipe[5])	stfd	[FActPtr[5]] = FActY[3], 8	(pPipe[2])	fmpy	RInv6[0] = RInv6[0], RInv2[0]				nop		0x0	}	{	.mfi				nop		0x0	(pPipe[5])	fnma	dVdASum = Charge[5], dVdATmp, dVdASum				nop		0x0	} ;;//	INNER LOOP 27	{	.mfi										(pPipe[5])	stfd	[FActPtr[5]] = FActZ[3]	(pPipe[3])	fsub	eps[0] = RT[1], n0[1]				nop		0x0	}	{	.mfb			br.ctop.sptk.many	innerLoop						} ;;// 	End of modulo-scheduled inner loop	//	Having finshed the loop, we now compute various quantities to	//	store. In paralllel, start computing computing some of the values	//	for the next loop trip, if we're going there.//	OUTER EPILOGUE 1    {   .mfi	(pCont)	shladd		typePtr = II, 2, TYPE			nop			0x0	(pCont)	shladd		II3 = II, 1, II    }	{	.mfi									(pCont)	shladd		chargePtr = II, 3, CHARGE		    	nop		0x0	(pCont)	shladd		IS3 = IS, 1, IS    } ;;//	OUTER EPILOGUE 2	{	.mfi		nop				0x0		nop				0x0		nop				0x0	} ;;//	OUTER EPILOGUE 3    {   .mfi	(pCont)	ld4			IS = [shiftPtr], 4			fadd		FActIX = FActIX, FIX	(pCont)	shladd 		isaPtr = II, 3, INVSQRTA	}    {   .mmf	(pCont)	setf.sig	f33 = NTYPE			nop			0x0			fadd		FShiftX = FShiftX, FIX	} ;;// 	OUTER EPILOGUE 4    {   .mfi	(pCont)	ld4				NTI = [typePtr]	  			fadd	FActIY = FActIY, FIY	(pCont)	shladd	shiftVPtr = IS3, 3, SHIFTVEC							}     {   .mfi		nop 0x0		fadd	FShiftY = FShiftY, FIY	(pCont)	shladd	posPtr = II3, 3, POSITION	} ;;//	OUTER EPILOGUE 5        {   .mfi		nop 	0x0		fadd	FActIZ = FActIZ, FIZ		nop 	0x0	} 	{   .mfi		nop 	0x0		fadd	FShiftZ = FShiftZ, FIZ				nop 	0x0	} ;;//	OUTER EPILOGUE 6	{	.mmi		stfd	[FActII] = FActIX, 8		stfd	[FShiftIS] = FShiftX, 8		nop 	0x0	}        {   .mmi		stfd    [VCPtr] = VCTotal	(pCont)		ld4     ggid = [gidPtr], 4 		nop 	0x0	} ;;//	OUTER EPILOGUE 7	{	.mmi		stfd	[dVdAIPtr] = dVdASum		stfd	[FActII] = FActIY, 8		shladd	dVdAIPtr = II, 3, DVDA	} 	{	.mmi		stfd	[FShiftIS] = FShiftY, 8	(pCont)	ld4	II = [iinrPtr] ,4		nop		0x0	} ;;//	OUTER EPILOGUE 8	{	.mmi		stfd	[FActII] = FActIZ		stfd    [VNBPtr] = VNBTotal	(pCont)	shladd	FActII = II3, 3, FACTION	}	{	.mib		stfd	[FShiftIS] = FShiftZ	(pCont)	shladd	FShiftIS = IS3, 3, FSHIFT	(pCont)	br.cond.sptk.many	outerLoop	} ;;	// Finish if this was the last chunk, or do another thread-loop iteration//  THREAD EPILOGUE 1	{ .mib						nop				0x0		nop				0x0	(pMore) br.cond.sptk.many threadLoop	} ;;		//	Ready to exit - restore the floating-point registers we saved, the	//	loop counter, and the predicates, then we're done. Note that the	//	stack pointer has the address of the last saved FP register.finish://  EXIT 1	{	.mmi		mov			fillP0 = sp		add			fillP1 = 16, sp		nop			0x0	}  	{	.mmi		st4			[OuterIter] = Nouter		st4			[InnerIter] = Ninner		nop			0x0	} ;;//  EXIT 2	{	.mmi		ldf.fill		fs13 = [fillP0], 32		ldf.fill		fs12 = [fillP1], 32		nop				0x0	} ;;//  EXIT 3	{	.mmi		ldf.fill		fs11 = [fillP0], 32		ldf.fill		fs10 = [fillP1], 32		nop				0x0	} ;;//  EXIT 4	{	.mmi		ldf.fill		fs9 = [fillP0], 32		ldf.fill		fs8 = [fillP1], 32		nop				0x0	} ;;//  EXIT 5	{	.mmi		ldf.fill		fs7 = [fillP0], 32		ldf.fill		fs6 = [fillP1], 32		add				sp = 13 * 16, sp	} ;;//  EXIT 6	{	.mmi		ldf.fill		fs5 = [fillP0], 32		ldf.fill		fs4 = [fillP1], 32		mov				ar.lc = LCSave	} ;;//  EXIT 7	{	.mmi		ldf.fill		fs3 = [fillP0], 32		ldf.fill		fs2 = [fillP1], 32		mov				pr = PRSave, 0x1ffff	} ;;//  EXIT 8	{	.mmb		ldf.fill		fs1 = [fillP0], 32		ldf.fill		fs0 = [fillP1], 32		br.ret.sptk.few	rp	} ;;	.endp	 nb_kernel410_ia64_double

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?