亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ev6-stxncpy.s

?? 嵌入式系統設計與實例開發源碼
?? S
字號:
/* * arch/alpha/lib/ev6-stxncpy.S * 21264 version contributed by Rick Gorton <rick.gorton@api-networks.com> * * Copy no more than COUNT bytes of the null-terminated string from * SRC to DST. * * This is an internal routine used by strncpy, stpncpy, and strncat. * As such, it uses special linkage conventions to make implementation * of these public functions more efficient. * * On input: *	t9 = return address *	a0 = DST *	a1 = SRC *	a2 = COUNT * * Furthermore, COUNT may not be zero. * * On output: *	t0  = last word written *	t10 = bitmask (with one bit set) indicating the byte position of *	      the end of the range specified by COUNT *	t12 = bitmask (with one bit set) indicating the last byte written *	a0  = unaligned address of the last *word* written *	a2  = the number of full words left in COUNT * * Furthermore, v0, a3-a5, t11, t12, and $at are untouched. * * Much of the information about 21264 scheduling/coding comes from: *	Compiler Writer's Guide for the Alpha 21264 *	abbreviated as 'CWG' in other comments here *	ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html * Scheduling notation: *	E	- either cluster *	U	- upper subcluster; U0 - subcluster U0; U1 - subcluster U1 *	L	- lower subcluster; L0 - subcluster L0; L1 - subcluster L1 * Try not to change the actual algorithm if possible for consistency. */#include <alpha/regdef.h>	.set noat	.set noreorder	.text/* There is a problem with either gdb (as of 4.16) or gas (as of 2.7) that   doesn't like putting the entry point for a procedure somewhere in the   middle of the procedure descriptor.  Work around this by putting the   aligned copy in its own procedure descriptor */	.ent stxncpy_aligned	.align 4stxncpy_aligned:	.frame sp, 0, t9, 0	.prologue 0	/* On entry to this basic block:	   t0 == the first destination word for masking back in	   t1 == the first source word.  */	/* Create the 1st output word and detect 0's in the 1st input word.  */	lda	t2, -1		# E : build a mask against false zero	mskqh	t2, a1, t2	# U :   detection in the src word (stall)	mskqh	t1, a1, t3	# U :	ornot	t1, t2, t2	# E : (stall)	mskql	t0, a1, t0	# U : assemble the first output word	cmpbge	zero, t2, t8	# E : bits set iff null found	or	t0, t3, t0	# E : (stall)	beq	a2, $a_eoc	# U :	bne	t8, $a_eos	# U :	nop	nop	nop	/* On entry to this basic block:	   t0 == a source word not containing a null.  */	/*	 * nops here to:	 *	separate store quads from load quads	 *	limit of 1 bcond/quad to permit training	 */$a_loop:	stq_u	t0, 0(a0)	# L :	addq	a0, 8, a0	# E :	subq	a2, 1, a2	# E :	nop	ldq_u	t0, 0(a1)	# L :	addq	a1, 8, a1	# E :	cmpbge	zero, t0, t8	# E :	beq	a2, $a_eoc      # U :	beq	t8, $a_loop	# U :	nop	nop	nop	/* Take care of the final (partial) word store.  At this point	   the end-of-count bit is set in t8 iff it applies.	   On entry to this basic block we have:	   t0 == the source word containing the null	   t8 == the cmpbge mask that found it.  */$a_eos:	negq	t8, t12		# E : find low bit set	and	t8, t12, t12	# E : (stall)	/* For the sake of the cache, don't read a destination word	   if we're not going to need it.  */	and	t12, 0x80, t6	# E : (stall)	bne	t6, 1f		# U : (stall)	/* We're doing a partial word store and so need to combine	   our source and original destination words.  */	ldq_u	t1, 0(a0)	# L :	subq	t12, 1, t6	# E :	or	t12, t6, t8	# E : (stall)	zapnot	t0, t8, t0	# U : clear src bytes > null (stall)	zap	t1, t8, t1	# .. e1 : clear dst bytes <= null	or	t0, t1, t0	# e1    : (stall)	nop	nop1:	stq_u	t0, 0(a0)	# L :	ret	(t9)		# L0 : Latency=3	nop	nop	/* Add the end-of-count bit to the eos detection bitmask.  */$a_eoc:	or	t10, t8, t8	# E :	br	$a_eos		# L0 : Latency=3	nop	nop	.end stxncpy_aligned	.align 4	.ent __stxncpy	.globl __stxncpy__stxncpy:	.frame sp, 0, t9, 0	.prologue 0	/* Are source and destination co-aligned?  */	xor	a0, a1, t1	# E :	and	a0, 7, t0	# E : find dest misalignment	and	t1, 7, t1	# E : (stall)	addq	a2, t0, a2	# E : bias count by dest misalignment (stall)	subq	a2, 1, a2	# E :	and	a2, 7, t2	# E : (stall)	srl	a2, 3, a2	# U : a2 = loop counter = (count - 1)/8 (stall)	addq	zero, 1, t10	# E :	sll	t10, t2, t10	# U : t10 = bitmask of last count byte	bne	t1, $unaligned	# U :	/* We are co-aligned; take care of a partial first word.  */	ldq_u	t1, 0(a1)	# L : load first src word	addq	a1, 8, a1	# E :	beq	t0, stxncpy_aligned     # U : avoid loading dest word if not needed	ldq_u	t0, 0(a0)	# L :	nop	nop	br	stxncpy_aligned	# .. e1 :	nop	nop	nop/* The source and destination are not co-aligned.  Align the destination   and cope.  We have to be very careful about not reading too much and   causing a SEGV.  */	.align 4$u_head:	/* We know just enough now to be able to assemble the first	   full source word.  We can still find a zero at the end of it	   that prevents us from outputting the whole thing.	   On entry to this basic block:	   t0 == the first dest word, unmasked	   t1 == the shifted low bits of the first source word	   t6 == bytemask that is -1 in dest word bytes */	ldq_u	t2, 8(a1)	# L : Latency=3 load second src word	addq	a1, 8, a1	# E :	mskql	t0, a0, t0	# U : mask trailing garbage in dst	extqh	t2, a1, t4	# U : (3 cycle stall on t2)	or	t1, t4, t1	# E : first aligned src word complete (stall)	mskqh	t1, a0, t1	# U : mask leading garbage in src (stall)	or	t0, t1, t0	# E : first output word complete (stall)	or	t0, t6, t6	# E : mask original data for zero test (stall)	cmpbge	zero, t6, t8	# E :	beq	a2, $u_eocfin	# U :	nop	nop	bne	t8, $u_final	# U :	lda	t6, -1		# E : mask out the bits we have	mskql	t6, a1, t6	# U :   already seen (stall)	stq_u	t0, 0(a0)	# L : store first output word	or      t6, t2, t2		# E :	cmpbge	zero, t2, t8		# E : find nulls in second partial (stall)	addq	a0, 8, a0		# E :	subq	a2, 1, a2		# E :	bne	t8, $u_late_head_exit	# U :	/* Finally, we've got all the stupid leading edge cases taken care	   of and we can set up to enter the main loop.  */	extql	t2, a1, t1	# U : position hi-bits of lo word	ldq_u	t2, 8(a1)	# L : read next high-order source word	addq	a1, 8, a1	# E :	cmpbge	zero, t2, t8	# E : (stall)	beq	a2, $u_eoc	# U :	nop	nop	bne	t8, $u_eos	# e1    :	nop	nop	nop	/* Unaligned copy main loop.  In order to avoid reading too much,	   the loop is structured to detect zeros in aligned source words.	   This has, unfortunately, effectively pulled half of a loop	   iteration out into the head and half into the tail, but it does	   prevent nastiness from accumulating in the very thing we want	   to run as fast as possible.	   On entry to this basic block:	   t1 == the shifted high-order bits from the previous source word	   t2 == the unshifted current source word	   We further know that t2 does not contain a null terminator.  */	.align 4$u_loop:	extqh	t2, a1, t0	# U : extract high bits for current word	addq	a1, 8, a1	# E :	extql	t2, a1, t3	# U : extract low bits for next time	addq	a0, 8, a0	# E :	or	t0, t1, t0	# E : current dst word now complete	ldq_u	t2, 0(a1)	# U : Latency=3 load high word for next time	stq_u	t0, -8(a0)	# U : save the current word (stall)	mov	t3, t1		# E :	subq	a2, 1, a2	# E :	cmpbge	zero, t2, t8	# E : test new word for eos (2 cycle stall for data)	beq	a2, $u_eoc	# U : (stall)	nop	beq	t8, $u_loop	# U :	nop	nop	nop	/* We've found a zero somewhere in the source word we just read.	   If it resides in the lower half, we have one (probably partial)	   word to write out, and if it resides in the upper half, we	   have one full and one partial word left to write out.	   On entry to this basic block:	   t1 == the shifted high-order bits from the previous source word	   t2 == the unshifted current source word.  */$u_eos:	extqh	t2, a1, t0	# U :	or	t0, t1, t0	# E : first (partial) source word complete (stall)	cmpbge	zero, t0, t8	# E : is the null in this first bit? (stall)	bne	t8, $u_final	# U : (stall)	stq_u	t0, 0(a0)	# L : the null was in the high-order bits	addq	a0, 8, a0	# E :	subq	a2, 1, a2	# E :	nop$u_late_head_exit:	extql	t2, a1, t0	# U :	cmpbge	zero, t0, t8	# E :	or	t8, t10, t6	# E : (stall)	cmoveq	a2, t6, t8	# E : Latency=2, extra map slot (stall)	/* Take care of a final (probably partial) result word.	   On entry to this basic block:	   t0 == assembled source word	   t8 == cmpbge mask that found the null.  */$u_final:	negq	t8, t6		# E : isolate low bit set	and	t6, t8, t12	# E : (stall)	and	t12, 0x80, t6	# E : avoid dest word load if we can (stall)	bne	t6, 1f		# U : (stall)	ldq_u	t1, 0(a0)	# L :	subq	t12, 1, t6	# E :	or	t6, t12, t8	# E : (stall)	zapnot	t0, t8, t0	# U : kill source bytes > null	zap	t1, t8, t1	# U : kill dest bytes <= null	or	t0, t1, t0	# E : (stall)	nop	nop1:	stq_u	t0, 0(a0)	# L :	ret	(t9)		# L0 : Latency=3$u_eoc:				# end-of-count	extqh	t2, a1, t0	# U :	or	t0, t1, t0	# E : (stall)	cmpbge	zero, t0, t8	# E : (stall)	nop$u_eocfin:			# end-of-count, final word	or	t10, t8, t8	# E :	br	$u_final	# L0 : Latency=3	nop	nop	/* Unaligned copy entry point.  */	.align 4$unaligned:	ldq_u	t1, 0(a1)	# L : load first source word	and	a0, 7, t4	# E : find dest misalignment	and	a1, 7, t5	# E : find src misalignment	/* Conditionally load the first destination word and a bytemask	   with 0xff indicating that the destination byte is sacrosanct.  */	mov	zero, t0	# E :	mov	zero, t6	# E :	beq	t4, 1f		# U :	ldq_u	t0, 0(a0)	# L :	lda	t6, -1		# E :	mskql	t6, a0, t6	# U :	nop	nop	nop1:	subq	a1, t4, a1	# E : sub dest misalignment from src addr	/* If source misalignment is larger than dest misalignment, we need	   extra startup checks to avoid SEGV.  */	cmplt	t4, t5, t12	# E :	extql	t1, a1, t1	# U : shift src into place	lda	t2, -1		# E : for creating masks later	beq	t12, $u_head	# U : (stall)	mskqh	t2, t5, t2	# U : begin src byte validity mask	cmpbge	zero, t1, t8	# E : is there a zero?	extql	t2, a1, t2	# U :	or	t8, t10, t5	# E : test for end-of-count too	cmpbge	zero, t2, t3	# E :	cmoveq	a2, t5, t8	# E : Latency=2, extra map slot	nop			# E : keep with cmoveq	andnot	t8, t3, t8	# E : (stall)	beq	t8, $u_head	# U :	/* At this point we've found a zero in the first partial word of	   the source.  We need to isolate the valid source data and mask	   it into the original destination data.  (Incidentally, we know	   that we'll need at least one byte of that original dest word.) */	ldq_u	t0, 0(a0)	# L :	negq	t8, t6		# E : build bitmask of bytes <= zero	mskqh	t1, t4, t1	# U :	and	t6, t8, t12	# E :	subq	t12, 1, t6	# E : (stall)	or	t6, t12, t8	# E : (stall)	zapnot	t2, t8, t2	# U : prepare source word; mirror changes (stall)	zapnot	t1, t8, t1	# U : to source validity mask	andnot	t0, t2, t0	# E : zero place for source to reside	or	t0, t1, t0	# E : and put it there (stall both t0, t1)	stq_u	t0, 0(a0)	# L : (stall)	ret	(t9)		# L0 : Latency=3	nop	nop	nop	.end __stxncpy

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩电影在线一区二区| 宅男噜噜噜66一区二区66| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲一区二区三区四区的| 中文字幕在线免费不卡| 国产日韩欧美精品在线| 中文字幕欧美激情一区| 日本一区二区三区四区在线视频 | 91在线高清观看| aaa国产一区| 在线观看三级视频欧美| 91国在线观看| 欧美肥妇free| 国产网站一区二区| 国产精品日韩成人| 国产日韩av一区二区| 国产精品电影院| 亚洲高清免费在线| 美女视频黄 久久| 国产一区二区成人久久免费影院| 国产精品1024| 91在线视频网址| 欧美日韩一区二区三区四区| 日韩欧美一区二区在线视频| 久久这里都是精品| 亚洲欧洲一区二区三区| 亚洲第一福利一区| 精品一区二区在线看| 成人av在线影院| 欧美人狂配大交3d怪物一区| 欧美r级电影在线观看| 国产精品拍天天在线| 亚洲国产色一区| 国产精品一二三区在线| 91久久一区二区| 久久日韩精品一区二区五区| 亚洲欧洲成人精品av97| 日韩和的一区二区| 成人精品鲁一区一区二区| 欧美日韩久久不卡| 亚洲欧洲另类国产综合| 丝袜美腿亚洲一区| va亚洲va日韩不卡在线观看| 日韩欧美国产综合一区| 亚洲精品久久嫩草网站秘色| 国产精品综合在线视频| 欧美日韩国产中文| 国产精品网友自拍| 蜜桃一区二区三区四区| 欧美体内she精视频| 国产精品久久久久久久久搜平片| 日本伊人色综合网| 91捆绑美女网站| 国产欧美日韩亚州综合 | 91蝌蚪porny成人天涯| 日韩欧美一区二区免费| 亚洲午夜精品在线| av激情综合网| 久久婷婷久久一区二区三区| 午夜精品免费在线| 91美女在线看| 国产精品高潮呻吟| 国产激情一区二区三区桃花岛亚洲| 欧美亚州韩日在线看免费版国语版| 国产精品网站在线播放| 国产黄色精品网站| 久久夜色精品一区| 激情伊人五月天久久综合| 在线成人午夜影院| 亚洲成人一二三| 欧美性猛片aaaaaaa做受| 亚洲欧美怡红院| 99国产欧美另类久久久精品| 亚洲国产高清在线| 国产精品伊人色| 国产亚洲欧美日韩日本| 国产一区二区在线电影| 久久久综合九色合综国产精品| 久久9热精品视频| 欧美tickling挠脚心丨vk| 久国产精品韩国三级视频| 日韩一区二区麻豆国产| 蜜桃久久久久久| 26uuu成人网一区二区三区| 久久99国产精品久久99| 久久综合狠狠综合久久激情| 国产精品一二三区在线| 国产精品家庭影院| 色婷婷久久一区二区三区麻豆| 亚洲色图欧美激情| 欧美视频在线一区二区三区 | 麻豆国产精品777777在线| 日韩一级免费观看| 国产一区欧美日韩| 日本一区二区三区高清不卡| 成人综合日日夜夜| 亚洲精品ww久久久久久p站| 在线亚洲一区二区| 免费在线观看日韩欧美| 久久夜色精品国产噜噜av| 国产成人精品亚洲日本在线桃色| 国产精品嫩草影院com| 在线观看欧美精品| 美女国产一区二区| 国产人成亚洲第一网站在线播放| 色婷婷综合久久久久中文| 日韩成人一区二区| 久久精品一区四区| 在线观看不卡视频| 精彩视频一区二区三区| 综合网在线视频| 91精品国产全国免费观看| 国产成人高清在线| 亚洲成人动漫在线免费观看| 亚洲精品一区二区三区福利| 久久午夜羞羞影院免费观看| 91麻豆免费观看| 国产精品影视在线| 亚洲不卡在线观看| 国产精品三级视频| 日韩一区二区不卡| 色综合久久66| 国产成人福利片| 青青草97国产精品免费观看| 中文字幕亚洲精品在线观看| 日韩欧美卡一卡二| 欧美亚洲一区二区在线观看| 国产在线精品一区二区夜色| 亚洲午夜在线电影| 中文字幕日韩av资源站| 精品久久久久久久久久久久久久久久久 | 欧美在线色视频| 国产成人无遮挡在线视频| 亚欧色一区w666天堂| 亚洲图片欧美激情| 国产日本欧美一区二区| 日韩你懂的电影在线观看| 欧美性做爰猛烈叫床潮| 91社区在线播放| 丁香桃色午夜亚洲一区二区三区| 麻豆国产欧美一区二区三区| 五月天激情小说综合| 亚洲成人免费看| 一级中文字幕一区二区| 亚洲日本青草视频在线怡红院| 久久久久久久综合| 亚洲精品一区二区三区福利| 日韩欧美电影一二三| 日韩欧美第一区| 日韩一区二区三区免费看| 欧美一级理论片| 欧美大片在线观看一区| 精品日韩在线观看| 精品国产一区二区亚洲人成毛片 | 欧美中文字幕亚洲一区二区va在线| 不卡欧美aaaaa| eeuss鲁片一区二区三区在线看| 国产精品18久久久久久久久| 国产精品1024| 99riav一区二区三区| 97久久久精品综合88久久| 97se亚洲国产综合自在线不卡| 菠萝蜜视频在线观看一区| 97精品视频在线观看自产线路二| 99久久综合99久久综合网站| 91麻豆国产精品久久| 欧美日韩国产乱码电影| 欧美一二三区精品| 久久综合色天天久久综合图片| 久久日韩粉嫩一区二区三区| 欧美国产精品中文字幕| 国产精品免费人成网站| 一区二区三区日本| 天堂一区二区在线| 麻豆精品国产91久久久久久| 国产成人在线视频免费播放| 不卡的av中国片| 欧美日韩国产综合视频在线观看| 欧美久久久久久久久久| 欧美精品一区二区精品网| 国产精品福利一区| 手机精品视频在线观看| 国产一区二区三区av电影| 色偷偷成人一区二区三区91| 欧美高清视频一二三区| 国产性天天综合网| 亚洲中国最大av网站| 国内精品视频一区二区三区八戒| 91在线观看成人| 欧美精品一区二区精品网| 一区二区高清在线| 九色综合国产一区二区三区| aaa国产一区| 精品嫩草影院久久| 亚洲影视资源网| 床上的激情91.| 日韩欧美一二区| 亚洲成av人片在线观看| 成人深夜福利app| 91精品国产色综合久久不卡电影 |