⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memcmp.s

📁 glibc 2.9,最新版的C语言库函数
💻 S
📖 第 1 页 / 共 2 页
字号:
	ld	rWORD7,-16(r1)L(zeroLength):	li	rRTN, 0	blr	.align 4/* At this point we know the strings have different alignment and the   compare length is at least 8 bytes.  rBITDIF containes the low order   3 bits of rSTR1 and cr5 contains the result of the logical compare   of rBITDIF to 0.  If rBITDIF == 0 then rStr1 is double word    aligned and can perform the DWunaligned loop.     Otherwise we know that rSTR1 is not aready DW aligned yet.   So we can force the string addresses to the next lower DW   boundary and special case this first DW word using shift left to   ellimiate bits preceeding the first byte.  Since we want to join the   normal (DWaligned) compare loop, starting at the second double word,   we need to adjust the length (rN) and special case the loop   versioning for the first DW. This insures that the loop count is   correct and the first DW (shifted) is in the expected resister pair.  */#define rSHL	r29	/* Unaligned shift left count.  */#define rSHR	r28	/* Unaligned shift right count.  */#define rB		r27	/* Left rotation temp for rWORD2.  */#define rD		r26	/* Left rotation temp for rWORD4.  */#define rF		r25	/* Left rotation temp for rWORD6.  */#define rH		r24	/* Left rotation temp for rWORD8.  */#define rA		r0	/* Right rotation temp for rWORD2.  */#define rC		r12	/* Right rotation temp for rWORD4.  */#define rE		r0	/* Right rotation temp for rWORD6.  */#define rG		r12	/* Right rotation temp for rWORD8.  */L(unaligned):	std	r29,-24(r1)		cfi_offset(r29,-24)	clrldi	rSHL, rSTR2, 61	beq-	cr6, L(duzeroLength)	std	r28,-32(r1)		cfi_offset(r28,-32)	beq	cr5, L(DWunaligned)	std	r27,-40(r1)		cfi_offset(r27,-40)/* Adjust the logical start of rSTR2 ro compensate for the extra bits   in the 1st rSTR1 DW.  */	sub	r27, rSTR2, rBITDIF/* But do not attempt to address the DW before that DW that contains   the actual start of rSTR2.  */	clrrdi	rSTR2, rSTR2, 3	std	r26,-48(r1)		cfi_offset(r26,-48)/* Compute the leaft/right shift counts for the unalign rSTR2,   compensating for the logical (DW aligned) start of rSTR1.  */ 	clrldi	rSHL, r27, 61	clrrdi	rSTR1, rSTR1, 3		std	r25,-56(r1)		cfi_offset(r25,-56)	sldi	rSHL, rSHL, 3	cmpld	cr5, r27, rSTR2	add	rN, rN, rBITDIF	sldi	r11, rBITDIF, 3	std	r24,-64(r1)		cfi_offset(r24,-64)	subfic	rSHR, rSHL, 64	srdi	rTMP, rN, 5	/* Divide by 32 */	andi.	rBITDIF, rN, 24	/* Get the DW remainder *//* We normally need to load 2 DWs to start the unaligned rSTR2, but in   this special case those bits may be discarded anyway.  Also we   must avoid loading a DW where none of the bits are part of rSTR2 as   this may cross a page boundary and cause a page fault.  */	li	rWORD8, 0	blt	cr5, L(dus0)	ld	rWORD8, 0(rSTR2)	la	rSTR2, 8(rSTR2)	sld	rWORD8, rWORD8, rSHLL(dus0):	ld	rWORD1, 0(rSTR1)	ld	rWORD2, 0(rSTR2)	cmpldi	cr1, rBITDIF, 16	cmpldi	cr7, rN, 32	srd	rG, rWORD2, rSHR	clrldi	rN, rN, 61	beq	L(duPs4)	mtctr   rTMP	/* Power4 wants mtctr 1st in dispatch group */	or	rWORD8, rG, rWORD8	bgt	cr1, L(duPs3)	beq	cr1, L(duPs2)/* Remainder is 8 */	.align 4L(dusP1):	sld	rB, rWORD2, rSHL	sld	rWORD7, rWORD1, r11	sld	rWORD8, rWORD8, r11	bge	cr7, L(duP1e)/* At this point we exit early with the first double word compare   complete and remainder of 0 to 7 bytes.  See L(du14) for details on   how we handle the remaining bytes.  */	cmpld	cr5, rWORD7, rWORD8	sldi.	rN, rN, 3	bne	cr5, L(duLcr5)	cmpld	cr7, rN, rSHR	beq	L(duZeroReturn)	li	rA, 0	ble	cr7, L(dutrim)	ld	rWORD2, 8(rSTR2)	srd	rA, rWORD2, rSHR	b	L(dutrim)/* Remainder is 16 */	.align 4L(duPs2):	sld	rH, rWORD2, rSHL	sld	rWORD5, rWORD1, r11	sld	rWORD6, rWORD8, r11	b	L(duP2e)/* Remainder is 24 */	.align 4L(duPs3):	sld	rF, rWORD2, rSHL	sld	rWORD3, rWORD1, r11	sld	rWORD4, rWORD8, r11	b	L(duP3e)/* Count is a multiple of 32, remainder is 0 */	.align 4L(duPs4):	mtctr   rTMP	/* Power4 wants mtctr 1st in dispatch group */	or	rWORD8, rG, rWORD8	sld	rD, rWORD2, rSHL	sld	rWORD1, rWORD1, r11	sld	rWORD2, rWORD8, r11	b	L(duP4e)/* At this point we know rSTR1 is double word aligned and the   compare length is at least 8 bytes.  */	.align 4L(DWunaligned):	std	r27,-40(r1)		cfi_offset(r27,-40)	clrrdi	rSTR2, rSTR2, 3	std	r26,-48(r1)		cfi_offset(r26,-48)	srdi	rTMP, rN, 5	/* Divide by 32 */	std	r25,-56(r1)		cfi_offset(r25,-56)	andi.	rBITDIF, rN, 24	/* Get the DW remainder */	std	r24,-64(r1)		cfi_offset(r24,-64)	sldi	rSHL, rSHL, 3	ld	rWORD6, 0(rSTR2)	ldu	rWORD8, 8(rSTR2)	cmpldi	cr1, rBITDIF, 16	cmpldi	cr7, rN, 32	clrldi	rN, rN, 61	subfic	rSHR, rSHL, 64	sld	rH, rWORD6, rSHL	beq	L(duP4)	mtctr   rTMP	/* Power4 wants mtctr 1st in dispatch group */	bgt	cr1, L(duP3)	beq	cr1, L(duP2)		/* Remainder is 8 */	.align 4L(duP1):	srd	rG, rWORD8, rSHR	ld	rWORD7, 0(rSTR1)	sld	rB, rWORD8, rSHL	or	rWORD8, rG, rH	blt	cr7, L(duP1x)L(duP1e):	ld	rWORD1, 8(rSTR1)	ld	rWORD2, 8(rSTR2)	cmpld	cr5, rWORD7, rWORD8	srd	rA, rWORD2, rSHR	sld	rD, rWORD2, rSHL	or	rWORD2, rA, rB	ld	rWORD3, 16(rSTR1)	ld	rWORD4, 16(rSTR2)	cmpld	cr0, rWORD1, rWORD2	srd	rC, rWORD4, rSHR	sld	rF, rWORD4, rSHL	bne	cr5, L(duLcr5)	or	rWORD4, rC, rD	ld	rWORD5, 24(rSTR1)	ld	rWORD6, 24(rSTR2)	cmpld	cr1, rWORD3, rWORD4	srd	rE, rWORD6, rSHR	sld	rH, rWORD6, rSHL	bne	cr0, L(duLcr0)	or	rWORD6, rE, rF	cmpld	cr6, rWORD5, rWORD6	b	L(duLoop3)		.align 4/* At this point we exit early with the first double word compare   complete and remainder of 0 to 7 bytes.  See L(du14) for details on   how we handle the remaining bytes.  */L(duP1x):	cmpld	cr5, rWORD7, rWORD8	sldi.	rN, rN, 3	bne	cr5, L(duLcr5)	cmpld	cr7, rN, rSHR	beq	L(duZeroReturn)	li	rA, 0	ble	cr7, L(dutrim)	ld	rWORD2, 8(rSTR2)	srd	rA, rWORD2, rSHR	b	L(dutrim)/* Remainder is 16 */	.align 4L(duP2):	srd	rE, rWORD8, rSHR	ld	rWORD5, 0(rSTR1)	or	rWORD6, rE, rH	sld	rH, rWORD8, rSHLL(duP2e):	ld	rWORD7, 8(rSTR1)	ld	rWORD8, 8(rSTR2)	cmpld	cr6, rWORD5, rWORD6	srd	rG, rWORD8, rSHR	sld	rB, rWORD8, rSHL	or	rWORD8, rG, rH	blt	cr7, L(duP2x)	ld	rWORD1, 16(rSTR1)	ld	rWORD2, 16(rSTR2)	cmpld	cr5, rWORD7, rWORD8	bne	cr6, L(duLcr6)	srd	rA, rWORD2, rSHR	sld	rD, rWORD2, rSHL	or	rWORD2, rA, rB	ld	rWORD3, 24(rSTR1)	ld	rWORD4, 24(rSTR2)	cmpld	cr0, rWORD1, rWORD2	bne	cr5, L(duLcr5)	srd	rC, rWORD4, rSHR	sld	rF, rWORD4, rSHL	or	rWORD4, rC, rD	addi	rSTR1, rSTR1, 8	addi	rSTR2, rSTR2, 8	cmpld	cr1, rWORD3, rWORD4	b	L(duLoop2)	.align 4L(duP2x):	cmpld	cr5, rWORD7, rWORD8	addi	rSTR1, rSTR1, 8	addi	rSTR2, rSTR2, 8	bne	cr6, L(duLcr6)	sldi.	rN, rN, 3	bne	cr5, L(duLcr5)	cmpld	cr7, rN, rSHR	beq	L(duZeroReturn)	li	rA, 0	ble	cr7, L(dutrim)	ld	rWORD2, 8(rSTR2)	srd	rA, rWORD2, rSHR	b	L(dutrim)		/* Remainder is 24 */	.align 4L(duP3):	srd	rC, rWORD8, rSHR	ld	rWORD3, 0(rSTR1)	sld	rF, rWORD8, rSHL	or	rWORD4, rC, rHL(duP3e):	ld	rWORD5, 8(rSTR1)	ld	rWORD6, 8(rSTR2)	cmpld	cr1, rWORD3, rWORD4	srd	rE, rWORD6, rSHR	sld	rH, rWORD6, rSHL	or	rWORD6, rE, rF	ld	rWORD7, 16(rSTR1)	ld	rWORD8, 16(rSTR2)	cmpld	cr6, rWORD5, rWORD6	bne	cr1, L(duLcr1)	srd	rG, rWORD8, rSHR	sld	rB, rWORD8, rSHL	or	rWORD8, rG, rH	blt	cr7, L(duP3x)	ld	rWORD1, 24(rSTR1)	ld	rWORD2, 24(rSTR2)	cmpld	cr5, rWORD7, rWORD8	bne	cr6, L(duLcr6)	srd	rA, rWORD2, rSHR	sld	rD, rWORD2, rSHL	or	rWORD2, rA, rB	addi	rSTR1, rSTR1, 16	addi	rSTR2, rSTR2, 16	cmpld	cr0, rWORD1, rWORD2	b	L(duLoop1)	.align 4L(duP3x):	addi	rSTR1, rSTR1, 16	addi	rSTR2, rSTR2, 16	bne	cr1, L(duLcr1)	cmpld	cr5, rWORD7, rWORD8	bne	cr6, L(duLcr6)	sldi.	rN, rN, 3	bne	cr5, L(duLcr5)	cmpld	cr7, rN, rSHR	beq	L(duZeroReturn)	li	rA, 0	ble	cr7, L(dutrim)	ld	rWORD2, 8(rSTR2)	srd	rA, rWORD2, rSHR	b	L(dutrim)	/* Count is a multiple of 32, remainder is 0 */	.align 4L(duP4):	mtctr   rTMP	/* Power4 wants mtctr 1st in dispatch group */	srd	rA, rWORD8, rSHR	ld	rWORD1, 0(rSTR1)	sld	rD, rWORD8, rSHL	or	rWORD2, rA, rHL(duP4e):	ld	rWORD3, 8(rSTR1)	ld	rWORD4, 8(rSTR2)	cmpld	cr0, rWORD1, rWORD2	srd	rC, rWORD4, rSHR	sld	rF, rWORD4, rSHL	or	rWORD4, rC, rD	ld	rWORD5, 16(rSTR1)	ld	rWORD6, 16(rSTR2)	cmpld	cr1, rWORD3, rWORD4	bne	cr0, L(duLcr0)	srd	rE, rWORD6, rSHR	sld	rH, rWORD6, rSHL	or	rWORD6, rE, rF	ldu	rWORD7, 24(rSTR1)	ldu	rWORD8, 24(rSTR2)	cmpld	cr6, rWORD5, rWORD6	bne	cr1, L(duLcr1)	srd	rG, rWORD8, rSHR	sld	rB, rWORD8, rSHL	or	rWORD8, rG, rH	cmpld	cr5, rWORD7, rWORD8	bdz-	L(du24)		/* Adjust CTR as we start with +4 *//* This is the primary loop */	.align 4L(duLoop):	ld	rWORD1, 8(rSTR1)	ld	rWORD2, 8(rSTR2)	cmpld	cr1, rWORD3, rWORD4	bne	cr6, L(duLcr6)	srd	rA, rWORD2, rSHR	sld	rD, rWORD2, rSHL	or	rWORD2, rA, rBL(duLoop1):	ld	rWORD3, 16(rSTR1)	ld	rWORD4, 16(rSTR2)	cmpld	cr6, rWORD5, rWORD6	bne	cr5, L(duLcr5)	srd	rC, rWORD4, rSHR	sld	rF, rWORD4, rSHL	or	rWORD4, rC, rDL(duLoop2):	ld	rWORD5, 24(rSTR1)	ld	rWORD6, 24(rSTR2)	cmpld	cr5, rWORD7, rWORD8	bne	cr0, L(duLcr0)	srd	rE, rWORD6, rSHR	sld	rH, rWORD6, rSHL	or	rWORD6, rE, rFL(duLoop3):	ldu	rWORD7, 32(rSTR1)	ldu	rWORD8, 32(rSTR2)	cmpld	cr0, rWORD1, rWORD2	bne-	cr1, L(duLcr1)	srd	rG, rWORD8, rSHR	sld	rB, rWORD8, rSHL	or	rWORD8, rG, rH	bdnz+	L(duLoop)		L(duL4):	bne	cr1, L(duLcr1)	cmpld	cr1, rWORD3, rWORD4	bne	cr6, L(duLcr6)	cmpld	cr6, rWORD5, rWORD6	bne	cr5, L(duLcr5)	cmpld	cr5, rWORD7, rWORD8L(du44):	bne	cr0, L(duLcr0)L(du34):	bne	cr1, L(duLcr1)L(du24):	bne	cr6, L(duLcr6)L(du14):	sldi.	rN, rN, 3	bne	cr5, L(duLcr5)/* At this point we have a remainder of 1 to 7 bytes to compare.  We use   shift right double to elliminate bits beyond the compare length.    This allows the use of double word subtract to compute the final   result.   However it may not be safe to load rWORD2 which may be beyond the    string length. So we compare the bit length of the remainder to   the right shift count (rSHR). If the bit count is less than or equal   we do not need to load rWORD2 (all significant bits are already in   rB).  */	cmpld	cr7, rN, rSHR	beq	L(duZeroReturn)	li	rA, 0	ble	cr7, L(dutrim)	ld	rWORD2, 8(rSTR2)	srd	rA, rWORD2, rSHR	.align 4L(dutrim):	ld	rWORD1, 8(rSTR1)	ld	rWORD8,-8(r1)	subfic	rN, rN, 64	/* Shift count is 64 - (rN * 8).  */ 	or	rWORD2, rA, rB	ld	rWORD7,-16(r1)		ld	r29,-24(r1)	srd	rWORD1, rWORD1, rN	srd	rWORD2, rWORD2, rN	ld	r28,-32(r1)		ld	r27,-40(r1)	li	rRTN, 0	cmpld	cr0, rWORD1, rWORD2		ld	r26,-48(r1)	ld	r25,-56(r1) 	beq	cr0, L(dureturn24)	li	rRTN, 1	ld	r24,-64(r1)	bgtlr	cr0	li	rRTN, -1	blr	.align 4L(duLcr0):	ld	rWORD8,-8(r1)	ld	rWORD7,-16(r1)	li	rRTN, 1	bgt	cr0, L(dureturn29)		ld	r29,-24(r1)	ld	r28,-32(r1)	li	rRTN, -1	b	L(dureturn27)	.align 4L(duLcr1):	ld	rWORD8,-8(r1)	ld	rWORD7,-16(r1)	li	rRTN, 1	bgt	cr1, L(dureturn29)		ld	r29,-24(r1)	ld	r28,-32(r1)	li	rRTN, -1	b	L(dureturn27)	.align 4L(duLcr6):	ld	rWORD8,-8(r1)	ld	rWORD7,-16(r1)	li	rRTN, 1	bgt	cr6, L(dureturn29)		ld	r29,-24(r1)	ld	r28,-32(r1)	li	rRTN, -1	b	L(dureturn27)	.align 4L(duLcr5):	ld	rWORD8,-8(r1)	ld	rWORD7,-16(r1)	li	rRTN, 1	bgt	cr5, L(dureturn29)		ld	r29,-24(r1)	ld	r28,-32(r1)	li	rRTN, -1	b	L(dureturn27)	.align	3L(duZeroReturn):	li	rRTN,0	.align	4L(dureturn):	ld	rWORD8,-8(r1)	ld	rWORD7,-16(r1)L(dureturn29):		ld	r29,-24(r1)	ld	r28,-32(r1)L(dureturn27):		ld	r27,-40(r1)L(dureturn26):		ld	r26,-48(r1)L(dureturn25):		ld	r25,-56(r1)L(dureturn24):	ld	r24,-64(r1)	blrL(duzeroLength):	li	rRTN,0	blrEND (BP_SYM (memcmp))libc_hidden_builtin_def (memcmp)weak_alias (memcmp, bcmp)

⌨️ 快捷键说明

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