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

📄 memcmp.s

📁 glibc 2.9,最新版的C语言库函数
💻 S
📖 第 1 页 / 共 2 页
字号:
	sub	rRTN, rWORD3, rWORD4	blrL(b11):L(bx12):	sub	rRTN, rWORD1, rWORD2	blr	.align 4 L(zeroLengthReturn):L(zeroLength):	li	rRTN, 0	blr	cfi_adjust_cfa_offset(64)	.align 4/* At this point we know the strings have different alignment and the   compare length is at least 8 bytes.  rBITDIF contains the low order   2 bits of rSTR1 and cr5 contains the result of the logical compare   of rBITDIF to 0.  If rBITDIF == 0 then rStr1 is word aligned and can    perform the Wunaligned loop.     Otherwise we know that rSTR1 is not aready word aligned yet.   So we can force the string addresses to the next lower word   boundary and special case this first word using shift left to   eliminate bits preceeding the first byte.  Since we want to join the   normal (Wualigned) compare loop, starting at the second word,   we need to adjust the length (rN) and special case the loop   versioning for the first W. This insures that the loop count is   correct and the first W (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):	stw     r29,40(r1)		cfi_offset(r29,(40-64))		clrlwi	rSHL, rSTR2, 30        stw     r28,36(r1)		cfi_offset(r28,(36-64))	beq	cr5, L(Wunaligned)        stw     r27,32(r1)		cfi_offset(r27,(32-64))/* Adjust the logical start of rSTR2 to compensate for the extra bits   in the 1st rSTR1 W.  */	sub	r27, rSTR2, rBITDIF/* But do not attempt to address the W before that W that contains   the actual start of rSTR2.  */	clrrwi	rSTR2, rSTR2, 2        stw     r26,28(r1)		cfi_offset(r26,(28-64))/* Compute the left/right shift counts for the unalign rSTR2,   compensating for the logical (W aligned) start of rSTR1.  */ 	clrlwi	rSHL, r27, 30	clrrwi	rSTR1, rSTR1, 2	        stw     r25,24(r1)		cfi_offset(r25,(24-64))	slwi	rSHL, rSHL, 3	cmplw	cr5, r27, rSTR2	add	rN, rN, rBITDIF	slwi	r11, rBITDIF, 3        stw     r24,20(r1)		cfi_offset(r24,(20-64))	subfic	rSHR, rSHL, 32	srwi	rTMP, rN, 4      /* Divide by 16 */	andi.	rBITDIF, rN, 12  /* Get the W remainder *//* We normally need to load 2 Ws to start the unaligned rSTR2, but in   this special case those bits may be discarded anyway.  Also we   must avoid loading a W 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)	lwz	rWORD8, 0(rSTR2)	la	rSTR2, 4(rSTR2)	slw	rWORD8, rWORD8, rSHLL(dus0):	lwz	rWORD1, 0(rSTR1)	lwz	rWORD2, 0(rSTR2)	cmplwi	cr1, rBITDIF, 8	cmplwi	cr7, rN, 16	srw	rG, rWORD2, rSHR	clrlwi	rN, rN, 30	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 4 */	.align 4L(dusP1):	slw	rB, rWORD2, rSHL	slw	rWORD7, rWORD1, r11	slw	rWORD8, rWORD8, r11	bge	cr7, L(duP1e)/* At this point we exit early with the first word compare   complete and remainder of 0 to 3 bytes.  See L(du14) for details on   how we handle the remaining bytes.  */	cmplw	cr5, rWORD7, rWORD8	slwi.	rN, rN, 3	bne	cr5, L(duLcr5)	cmplw	cr7, rN, rSHR	beq	L(duZeroReturn)	li	rA, 0	ble	cr7, L(dutrim)	lwz	rWORD2, 4(rSTR2)	srw	rA, rWORD2, rSHR	b	L(dutrim)/* Remainder is 8 */	.align 4L(duPs2):	slw	rH, rWORD2, rSHL	slw	rWORD5, rWORD1, r11	slw	rWORD6, rWORD8, r11	b	L(duP2e)/* Remainder is 12 */	.align 4L(duPs3):	slw	rF, rWORD2, rSHL	slw	rWORD3, rWORD1, r11	slw	rWORD4, rWORD8, r11	b	L(duP3e)/* Count is a multiple of 16, remainder is 0 */	.align 4L(duPs4):	mtctr   rTMP	/* Power4 wants mtctr 1st in dispatch group */	or	rWORD8, rG, rWORD8	slw	rD, rWORD2, rSHL	slw	rWORD1, rWORD1, r11	slw	rWORD2, rWORD8, r11	b	L(duP4e)/* At this point we know rSTR1 is word aligned and the   compare length is at least 8 bytes.  */	.align 4L(Wunaligned):        stw     r27,32(r1)		cfi_offset(r27,(32-64))	clrrwi	rSTR2, rSTR2, 2        stw     r26,28(r1)		cfi_offset(r26,(28-64))	srwi	rTMP, rN, 4	 /* Divide by 16 */        stw     r25,24(r1)		cfi_offset(r25,(24-64))	andi.	rBITDIF, rN, 12  /* Get the W remainder */        stw     r24,20(r1)		cfi_offset(r24,(24-64))	slwi	rSHL, rSHL, 3	lwz	rWORD6, 0(rSTR2)	lwzu	rWORD8, 4(rSTR2)	cmplwi	cr1, rBITDIF, 8	cmplwi	cr7, rN, 16	clrlwi	rN, rN, 30	subfic	rSHR, rSHL, 32	slw	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 4 */	.align 4L(duP1):	srw	rG, rWORD8, rSHR	lwz	rWORD7, 0(rSTR1)	slw	rB, rWORD8, rSHL	or	rWORD8, rG, rH	blt	cr7, L(duP1x)L(duP1e):	lwz	rWORD1, 4(rSTR1)	lwz	rWORD2, 4(rSTR2)	cmplw	cr5, rWORD7, rWORD8	srw	rA, rWORD2, rSHR	slw	rD, rWORD2, rSHL	or	rWORD2, rA, rB	lwz	rWORD3, 8(rSTR1)	lwz	rWORD4, 8(rSTR2)	cmplw	cr0, rWORD1, rWORD2	srw	rC, rWORD4, rSHR	slw	rF, rWORD4, rSHL	bne	cr5, L(duLcr5)	or	rWORD4, rC, rD	lwz	rWORD5, 12(rSTR1)	lwz	rWORD6, 12(rSTR2)	cmplw	cr1, rWORD3, rWORD4	srw	rE, rWORD6, rSHR	slw	rH, rWORD6, rSHL	bne	cr0, L(duLcr0)	or	rWORD6, rE, rF	cmplw	cr6, rWORD5, rWORD6	b	L(duLoop3)		.align 4/* At this point we exit early with the first word compare   complete and remainder of 0 to 3 bytes.  See L(du14) for details on   how we handle the remaining bytes.  */L(duP1x):	cmplw	cr5, rWORD7, rWORD8	slwi.	rN, rN, 3	bne	cr5, L(duLcr5)	cmplw	cr7, rN, rSHR	beq	L(duZeroReturn)	li	rA, 0	ble	cr7, L(dutrim)	ld	rWORD2, 8(rSTR2)	srw	rA, rWORD2, rSHR	b	L(dutrim)/* Remainder is 8 */	.align 4L(duP2):	srw	rE, rWORD8, rSHR	lwz	rWORD5, 0(rSTR1)	or	rWORD6, rE, rH	slw	rH, rWORD8, rSHLL(duP2e):	lwz	rWORD7, 4(rSTR1)	lwz	rWORD8, 4(rSTR2)	cmplw	cr6, rWORD5, rWORD6	srw	rG, rWORD8, rSHR	slw	rB, rWORD8, rSHL	or	rWORD8, rG, rH	blt	cr7, L(duP2x)	lwz	rWORD1, 8(rSTR1)	lwz	rWORD2, 8(rSTR2)	cmplw	cr5, rWORD7, rWORD8	bne	cr6, L(duLcr6)	srw	rA, rWORD2, rSHR	slw	rD, rWORD2, rSHL	or	rWORD2, rA, rB	lwz	rWORD3, 12(rSTR1)	lwz	rWORD4, 12(rSTR2)	cmplw	cr0, rWORD1, rWORD2	bne	cr5, L(duLcr5)	srw	rC, rWORD4, rSHR	slw	rF, rWORD4, rSHL	or	rWORD4, rC, rD	addi	rSTR1, rSTR1, 4	addi	rSTR2, rSTR2, 4	cmplw	cr1, rWORD3, rWORD4	b	L(duLoop2)	.align 4L(duP2x):	cmplw	cr5, rWORD7, rWORD8	addi	rSTR1, rSTR1, 4	addi	rSTR2, rSTR2, 4	bne	cr6, L(duLcr6)	slwi.	rN, rN, 3	bne	cr5, L(duLcr5)	cmplw	cr7, rN, rSHR	beq	L(duZeroReturn)	li	rA, 0	ble	cr7, L(dutrim)	lwz	rWORD2, 4(rSTR2)	srw	rA, rWORD2, rSHR	b	L(dutrim)		/* Remainder is 12 */	.align 4L(duP3):	srw	rC, rWORD8, rSHR	lwz	rWORD3, 0(rSTR1)	slw	rF, rWORD8, rSHL	or	rWORD4, rC, rHL(duP3e):	lwz	rWORD5, 4(rSTR1)	lwz	rWORD6, 4(rSTR2)	cmplw	cr1, rWORD3, rWORD4	srw	rE, rWORD6, rSHR	slw	rH, rWORD6, rSHL	or	rWORD6, rE, rF	lwz	rWORD7, 8(rSTR1)	lwz	rWORD8, 8(rSTR2)	cmplw	cr6, rWORD5, rWORD6	bne	cr1, L(duLcr1)	srw	rG, rWORD8, rSHR	slw	rB, rWORD8, rSHL	or	rWORD8, rG, rH	blt	cr7, L(duP3x)	lwz	rWORD1, 12(rSTR1)	lwz	rWORD2, 12(rSTR2)	cmplw	cr5, rWORD7, rWORD8	bne	cr6, L(duLcr6)	srw	rA, rWORD2, rSHR	slw	rD, rWORD2, rSHL	or	rWORD2, rA, rB	addi	rSTR1, rSTR1, 8	addi	rSTR2, rSTR2, 8	cmplw	cr0, rWORD1, rWORD2	b	L(duLoop1)	.align 4L(duP3x):	addi	rSTR1, rSTR1, 8	addi	rSTR2, rSTR2, 8	bne	cr1, L(duLcr1)	cmplw	cr5, rWORD7, rWORD8	bne	cr6, L(duLcr6)	slwi.	rN, rN, 3	bne	cr5, L(duLcr5)	cmplw	cr7, rN, rSHR	beq	L(duZeroReturn)	li	rA, 0	ble	cr7, L(dutrim)	lwz	rWORD2, 4(rSTR2)	srw	rA, rWORD2, rSHR	b	L(dutrim)	/* Count is a multiple of 16, remainder is 0 */	.align 4L(duP4):	mtctr   rTMP	/* Power4 wants mtctr 1st in dispatch group */	srw	rA, rWORD8, rSHR	lwz	rWORD1, 0(rSTR1)	slw	rD, rWORD8, rSHL	or	rWORD2, rA, rHL(duP4e):	lwz	rWORD3, 4(rSTR1)	lwz	rWORD4, 4(rSTR2)	cmplw	cr0, rWORD1, rWORD2	srw	rC, rWORD4, rSHR	slw	rF, rWORD4, rSHL	or	rWORD4, rC, rD	lwz	rWORD5, 8(rSTR1)	lwz	rWORD6, 8(rSTR2)	cmplw	cr1, rWORD3, rWORD4	bne	cr0, L(duLcr0)	srw	rE, rWORD6, rSHR	slw	rH, rWORD6, rSHL	or	rWORD6, rE, rF	lwzu	rWORD7, 12(rSTR1)	lwzu	rWORD8, 12(rSTR2)	cmplw	cr6, rWORD5, rWORD6	bne	cr1, L(duLcr1)	srw	rG, rWORD8, rSHR	slw	rB, rWORD8, rSHL	or	rWORD8, rG, rH	cmplw	cr5, rWORD7, rWORD8	bdz-	L(du24)		/* Adjust CTR as we start with +4 *//* This is the primary loop */	.align 4L(duLoop):	lwz	rWORD1, 4(rSTR1)	lwz	rWORD2, 4(rSTR2)	cmplw	cr1, rWORD3, rWORD4	bne	cr6, L(duLcr6)	srw	rA, rWORD2, rSHR	slw	rD, rWORD2, rSHL	or	rWORD2, rA, rBL(duLoop1):	lwz	rWORD3, 8(rSTR1)	lwz	rWORD4, 8(rSTR2)	cmplw	cr6, rWORD5, rWORD6	bne	cr5, L(duLcr5)	srw	rC, rWORD4, rSHR	slw	rF, rWORD4, rSHL	or	rWORD4, rC, rDL(duLoop2):	lwz	rWORD5, 12(rSTR1)	lwz	rWORD6, 12(rSTR2)	cmplw	cr5, rWORD7, rWORD8	bne	cr0, L(duLcr0)	srw	rE, rWORD6, rSHR	slw	rH, rWORD6, rSHL	or	rWORD6, rE, rFL(duLoop3):	lwzu	rWORD7, 16(rSTR1)	lwzu	rWORD8, 16(rSTR2)	cmplw	cr0, rWORD1, rWORD2	bne-	cr1, L(duLcr1)	srw	rG, rWORD8, rSHR	slw	rB, rWORD8, rSHL	or	rWORD8, rG, rH	bdnz+	L(duLoop)		L(duL4):	bne	cr1, L(duLcr1)	cmplw	cr1, rWORD3, rWORD4	bne	cr6, L(duLcr6)	cmplw	cr6, rWORD5, rWORD6	bne	cr5, L(duLcr5)	cmplw	cr5, rWORD7, rWORD8L(du44):	bne	cr0, L(duLcr0)L(du34):	bne	cr1, L(duLcr1)L(du24):	bne	cr6, L(duLcr6)L(du14):	slwi.	rN, rN, 3	bne	cr5, L(duLcr5)/* At this point we have a remainder of 1 to 3 bytes to compare.  We use   shift right to eliminate bits beyond the compare length.    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).  */	cmplw	cr7, rN, rSHR	beq	L(duZeroReturn)	li	rA, 0	ble	cr7, L(dutrim)	lwz	rWORD2, 4(rSTR2)	srw	rA, rWORD2, rSHR	.align 4L(dutrim):	lwz	rWORD1, 4(rSTR1)        lwz     r31,48(1)	subfic	rN, rN, 32	/* Shift count is 32 - (rN * 8).  */ 	or	rWORD2, rA, rB        lwz     r30,44(1)        lwz     r29,40(r1)	srw	rWORD1, rWORD1, rN	srw	rWORD2, rWORD2, rN        lwz     r28,36(r1)	        lwz     r27,32(r1)        cmplw   rWORD1,rWORD2        li      rRTN,0        beq     L(dureturn26)        li      rRTN,1        bgt     L(dureturn26)        li      rRTN,-1	b    L(dureturn26)	.align 4L(duLcr0):        lwz     r31,48(1)        lwz     r30,44(1)	li	rRTN, 1	bgt	cr0, L(dureturn29)		lwz     r29,40(r1)        lwz     r28,36(r1)		li	rRTN, -1	b	L(dureturn27)	.align 4L(duLcr1):        lwz     r31,48(1)        lwz     r30,44(1)	li	rRTN, 1	bgt	cr1, L(dureturn29)	        lwz     r29,40(r1)        lwz     r28,36(r1)		li	rRTN, -1	b	L(dureturn27)	.align 4L(duLcr6):        lwz     r31,48(1)        lwz     r30,44(1)	li	rRTN, 1	bgt	cr6, L(dureturn29)	        lwz     r29,40(r1)        lwz     r28,36(r1)		li	rRTN, -1	b	L(dureturn27)	.align 4L(duLcr5):        lwz     r31,48(1)        lwz     r30,44(1)	li	rRTN, 1	bgt	cr5, L(dureturn29)	        lwz     r29,40(r1)        lwz     r28,36(r1)		li	rRTN, -1	b	L(dureturn27)	.align	3L(duZeroReturn):	li	rRTN,0	.align	4L(dureturn):        lwz     r31,48(1)        lwz     r30,44(1)L(dureturn29):	        lwz     r29,40(r1)        lwz     r28,36(r1)	L(dureturn27):	        lwz     r27,32(r1)L(dureturn26):	        lwz     r26,28(r1)L(dureturn25):	        lwz     r25,24(r1)        lwz     r24,20(r1)        lwz     1,0(1)	blrEND (BP_SYM (memcmp))libc_hidden_builtin_def (memcmp)weak_alias (memcmp, bcmp)

⌨️ 快捷键说明

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