Re: memmove() in 2.4.0-test12, alpha platform
On Thu, Dec 21, 2000 at 06:40:46PM +0300, Ivan Kokshaysky wrote: > On Wed, Dec 20, 2000 at 10:03:42PM +0300, Alexander Zarochentcev wrote: > > New (since test12) optimized memmove function seems to be broken > > on alpha platform. > > Indeed it is. > > > If dest and src arguments are misaligned, new memmove does wrong things. > > Actually it broke when dest < src. Incrementing pointers should be used in > this case. > > This patch seems to work (tested in userspace). > > Ivan. > > --- linux/arch/alpha/lib/memmove.S.orig Tue Dec 12 00:46:26 2000 > +++ linux/arch/alpha/lib/memmove.SThu Dec 21 18:32:59 2000 > @@ -26,12 +26,16 @@ memmove: > bne $1,memcpy > > and $2,7,$2 /* Test for src/dest co-alignment. */ > - bne $2,$misaligned > + and $16,7,$1 > + cmpule $16,$17,$3 > + bne $3,$memmove_up /* dest < src */ > > and $4,7,$1 > - beq $1,$skip_aligned_byte_loop_head > + bne $2,$misaligned_dn > + unop > + beq $1,$skip_aligned_byte_loop_head_dn > > -$aligned_byte_loop_head: > +$aligned_byte_loop_head_dn: > lda $4,-1($4) > lda $5,-1($5) > unop > @@ -48,13 +52,13 @@ $aligned_byte_loop_head: > and $4,7,$6 > > stq_u $1,0($4) > - bne $6,$aligned_byte_loop_head > + bne $6,$aligned_byte_loop_head_dn > > -$skip_aligned_byte_loop_head: > +$skip_aligned_byte_loop_head_dn: > lda $18,-8($18) > - blt $18,$skip_aligned_word_loop > + blt $18,$skip_aligned_word_loop_dn > > -$aligned_word_loop: > +$aligned_word_loop_dn: > ldq $1,-8($5) > nop > lda $5,-8($5) > @@ -63,22 +67,22 @@ $aligned_word_loop: > stq $1,-8($4) > nop > lda $4,-8($4) > - bge $18,$aligned_word_loop > + bge $18,$aligned_word_loop_dn > > -$skip_aligned_word_loop: > +$skip_aligned_word_loop_dn: > lda $18,8($18) > - bgt $18,$byte_loop_tail > + bgt $18,$byte_loop_tail_dn > unop > ret $31,($26),1 > > .align 4 > -$misaligned: > +$misaligned_dn: > nop > fnop > unop > beq $18,$egress > > -$byte_loop_tail: > +$byte_loop_tail_dn: > ldq_u $3,-1($5) > ldq_u $2,-1($4) > lda $5,-1($5) > @@ -91,8 +95,77 @@ $byte_loop_tail: > > bis $1,$2,$1 > stq_u $1,0($4) > + bgt $18,$byte_loop_tail_dn > + br $egress > + > +$memmove_up: > + mov $16,$4 > + mov $17,$5 > + bne $2,$misaligned_up > + beq $1,$skip_aligned_byte_loop_head_up > + > +$aligned_byte_loop_head_up: > + unop > + ble $18,$egress > + ldq_u $3,0($5) > + ldq_u $2,0($4) > + > + lda $18,-1($18) > + extbl $3,$5,$1 > + insbl $1,$4,$1 > + mskbl $2,$4,$2 > + > + bis $1,$2,$1 > + lda $5,1($5) > + stq_u $1,0($4) > + lda $4,1($4) > + > + and $4,7,$6 > + bne $6,$aligned_byte_loop_head_up > + > +$skip_aligned_byte_loop_head_up: > + lda $18,-8($18) > + blt $18,$skip_aligned_word_loop_up > + > +$aligned_word_loop_up: > + ldq $1,0($5) > + nop > + lda $5,8($5) > + lda $18,-8($18) > + > + stq $1,0($4) > + nop > + lda $4,8($4) > + bge $18,$aligned_word_loop_up > + > +$skip_aligned_word_loop_up: > + lda $18,8($18) > + bgt $18,$byte_loop_tail_up > + unop > + ret $31,($26),1 > + > + .align 4 > +$misaligned_up: > + nop > + fnop > + unop > + beq $18,$egress > + > +$byte_loop_tail_up: > + ldq_u $3,0($5) > + ldq_u $2,0($4) > + lda $18,-1($18) > + extbl $3,$5,$1 > + > + insbl $1,$4,$1 > + mskbl $2,$4,$2 > + bis $1,$2,$1 > + stq_u $1,0($4) > + > + lda $5,1($5) > + lda $4,1($4) > nop > - bgt $18,$byte_loop_tail > + bgt $18,$byte_loop_tail_up > > $egress: > ret $31,($26),1 Ok. It works. Thanks. -- Alex. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] Please read the FAQ at http://www.tux.org/lkml/
Re: memmove() in 2.4.0-test12, alpha platform
On Thu, Dec 21, 2000 at 06:40:46PM +0300, Ivan Kokshaysky wrote: On Wed, Dec 20, 2000 at 10:03:42PM +0300, Alexander Zarochentcev wrote: New (since test12) optimized memmove function seems to be broken on alpha platform. Indeed it is. If dest and src arguments are misaligned, new memmove does wrong things. Actually it broke when dest src. Incrementing pointers should be used in this case. This patch seems to work (tested in userspace). Ivan. --- linux/arch/alpha/lib/memmove.S.orig Tue Dec 12 00:46:26 2000 +++ linux/arch/alpha/lib/memmove.SThu Dec 21 18:32:59 2000 @@ -26,12 +26,16 @@ memmove: bne $1,memcpy and $2,7,$2 /* Test for src/dest co-alignment. */ - bne $2,$misaligned + and $16,7,$1 + cmpule $16,$17,$3 + bne $3,$memmove_up /* dest src */ and $4,7,$1 - beq $1,$skip_aligned_byte_loop_head + bne $2,$misaligned_dn + unop + beq $1,$skip_aligned_byte_loop_head_dn -$aligned_byte_loop_head: +$aligned_byte_loop_head_dn: lda $4,-1($4) lda $5,-1($5) unop @@ -48,13 +52,13 @@ $aligned_byte_loop_head: and $4,7,$6 stq_u $1,0($4) - bne $6,$aligned_byte_loop_head + bne $6,$aligned_byte_loop_head_dn -$skip_aligned_byte_loop_head: +$skip_aligned_byte_loop_head_dn: lda $18,-8($18) - blt $18,$skip_aligned_word_loop + blt $18,$skip_aligned_word_loop_dn -$aligned_word_loop: +$aligned_word_loop_dn: ldq $1,-8($5) nop lda $5,-8($5) @@ -63,22 +67,22 @@ $aligned_word_loop: stq $1,-8($4) nop lda $4,-8($4) - bge $18,$aligned_word_loop + bge $18,$aligned_word_loop_dn -$skip_aligned_word_loop: +$skip_aligned_word_loop_dn: lda $18,8($18) - bgt $18,$byte_loop_tail + bgt $18,$byte_loop_tail_dn unop ret $31,($26),1 .align 4 -$misaligned: +$misaligned_dn: nop fnop unop beq $18,$egress -$byte_loop_tail: +$byte_loop_tail_dn: ldq_u $3,-1($5) ldq_u $2,-1($4) lda $5,-1($5) @@ -91,8 +95,77 @@ $byte_loop_tail: bis $1,$2,$1 stq_u $1,0($4) + bgt $18,$byte_loop_tail_dn + br $egress + +$memmove_up: + mov $16,$4 + mov $17,$5 + bne $2,$misaligned_up + beq $1,$skip_aligned_byte_loop_head_up + +$aligned_byte_loop_head_up: + unop + ble $18,$egress + ldq_u $3,0($5) + ldq_u $2,0($4) + + lda $18,-1($18) + extbl $3,$5,$1 + insbl $1,$4,$1 + mskbl $2,$4,$2 + + bis $1,$2,$1 + lda $5,1($5) + stq_u $1,0($4) + lda $4,1($4) + + and $4,7,$6 + bne $6,$aligned_byte_loop_head_up + +$skip_aligned_byte_loop_head_up: + lda $18,-8($18) + blt $18,$skip_aligned_word_loop_up + +$aligned_word_loop_up: + ldq $1,0($5) + nop + lda $5,8($5) + lda $18,-8($18) + + stq $1,0($4) + nop + lda $4,8($4) + bge $18,$aligned_word_loop_up + +$skip_aligned_word_loop_up: + lda $18,8($18) + bgt $18,$byte_loop_tail_up + unop + ret $31,($26),1 + + .align 4 +$misaligned_up: + nop + fnop + unop + beq $18,$egress + +$byte_loop_tail_up: + ldq_u $3,0($5) + ldq_u $2,0($4) + lda $18,-1($18) + extbl $3,$5,$1 + + insbl $1,$4,$1 + mskbl $2,$4,$2 + bis $1,$2,$1 + stq_u $1,0($4) + + lda $5,1($5) + lda $4,1($4) nop - bgt $18,$byte_loop_tail + bgt $18,$byte_loop_tail_up $egress: ret $31,($26),1 Ok. It works. Thanks. -- Alex. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] Please read the FAQ at http://www.tux.org/lkml/
Re: memmove() in 2.4.0-test12, alpha platform
On Wed, Dec 20, 2000 at 10:03:42PM +0300, Alexander Zarochentcev wrote: > New (since test12) optimized memmove function seems to be broken > on alpha platform. Indeed it is. > If dest and src arguments are misaligned, new memmove does wrong things. Actually it broke when dest < src. Incrementing pointers should be used in this case. This patch seems to work (tested in userspace). Ivan. --- linux/arch/alpha/lib/memmove.S.orig Tue Dec 12 00:46:26 2000 +++ linux/arch/alpha/lib/memmove.S Thu Dec 21 18:32:59 2000 @@ -26,12 +26,16 @@ memmove: bne $1,memcpy and $2,7,$2 /* Test for src/dest co-alignment. */ - bne $2,$misaligned + and $16,7,$1 + cmpule $16,$17,$3 + bne $3,$memmove_up /* dest < src */ and $4,7,$1 - beq $1,$skip_aligned_byte_loop_head + bne $2,$misaligned_dn + unop + beq $1,$skip_aligned_byte_loop_head_dn -$aligned_byte_loop_head: +$aligned_byte_loop_head_dn: lda $4,-1($4) lda $5,-1($5) unop @@ -48,13 +52,13 @@ $aligned_byte_loop_head: and $4,7,$6 stq_u $1,0($4) - bne $6,$aligned_byte_loop_head + bne $6,$aligned_byte_loop_head_dn -$skip_aligned_byte_loop_head: +$skip_aligned_byte_loop_head_dn: lda $18,-8($18) - blt $18,$skip_aligned_word_loop + blt $18,$skip_aligned_word_loop_dn -$aligned_word_loop: +$aligned_word_loop_dn: ldq $1,-8($5) nop lda $5,-8($5) @@ -63,22 +67,22 @@ $aligned_word_loop: stq $1,-8($4) nop lda $4,-8($4) - bge $18,$aligned_word_loop + bge $18,$aligned_word_loop_dn -$skip_aligned_word_loop: +$skip_aligned_word_loop_dn: lda $18,8($18) - bgt $18,$byte_loop_tail + bgt $18,$byte_loop_tail_dn unop ret $31,($26),1 .align 4 -$misaligned: +$misaligned_dn: nop fnop unop beq $18,$egress -$byte_loop_tail: +$byte_loop_tail_dn: ldq_u $3,-1($5) ldq_u $2,-1($4) lda $5,-1($5) @@ -91,8 +95,77 @@ $byte_loop_tail: bis $1,$2,$1 stq_u $1,0($4) + bgt $18,$byte_loop_tail_dn + br $egress + +$memmove_up: + mov $16,$4 + mov $17,$5 + bne $2,$misaligned_up + beq $1,$skip_aligned_byte_loop_head_up + +$aligned_byte_loop_head_up: + unop + ble $18,$egress + ldq_u $3,0($5) + ldq_u $2,0($4) + + lda $18,-1($18) + extbl $3,$5,$1 + insbl $1,$4,$1 + mskbl $2,$4,$2 + + bis $1,$2,$1 + lda $5,1($5) + stq_u $1,0($4) + lda $4,1($4) + + and $4,7,$6 + bne $6,$aligned_byte_loop_head_up + +$skip_aligned_byte_loop_head_up: + lda $18,-8($18) + blt $18,$skip_aligned_word_loop_up + +$aligned_word_loop_up: + ldq $1,0($5) + nop + lda $5,8($5) + lda $18,-8($18) + + stq $1,0($4) + nop + lda $4,8($4) + bge $18,$aligned_word_loop_up + +$skip_aligned_word_loop_up: + lda $18,8($18) + bgt $18,$byte_loop_tail_up + unop + ret $31,($26),1 + + .align 4 +$misaligned_up: + nop + fnop + unop + beq $18,$egress + +$byte_loop_tail_up: + ldq_u $3,0($5) + ldq_u $2,0($4) + lda $18,-1($18) + extbl $3,$5,$1 + + insbl $1,$4,$1 + mskbl $2,$4,$2 + bis $1,$2,$1 + stq_u $1,0($4) + + lda $5,1($5) + lda $4,1($4) nop - bgt $18,$byte_loop_tail + bgt $18,$byte_loop_tail_up $egress: ret $31,($26),1 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] Please read the FAQ at http://www.tux.org/lkml/
Re: memmove() in 2.4.0-test12, alpha platform
On Wed, Dec 20, 2000 at 10:03:42PM +0300, Alexander Zarochentcev wrote: New (since test12) optimized memmove function seems to be broken on alpha platform. Indeed it is. If dest and src arguments are misaligned, new memmove does wrong things. Actually it broke when dest src. Incrementing pointers should be used in this case. This patch seems to work (tested in userspace). Ivan. --- linux/arch/alpha/lib/memmove.S.orig Tue Dec 12 00:46:26 2000 +++ linux/arch/alpha/lib/memmove.S Thu Dec 21 18:32:59 2000 @@ -26,12 +26,16 @@ memmove: bne $1,memcpy and $2,7,$2 /* Test for src/dest co-alignment. */ - bne $2,$misaligned + and $16,7,$1 + cmpule $16,$17,$3 + bne $3,$memmove_up /* dest src */ and $4,7,$1 - beq $1,$skip_aligned_byte_loop_head + bne $2,$misaligned_dn + unop + beq $1,$skip_aligned_byte_loop_head_dn -$aligned_byte_loop_head: +$aligned_byte_loop_head_dn: lda $4,-1($4) lda $5,-1($5) unop @@ -48,13 +52,13 @@ $aligned_byte_loop_head: and $4,7,$6 stq_u $1,0($4) - bne $6,$aligned_byte_loop_head + bne $6,$aligned_byte_loop_head_dn -$skip_aligned_byte_loop_head: +$skip_aligned_byte_loop_head_dn: lda $18,-8($18) - blt $18,$skip_aligned_word_loop + blt $18,$skip_aligned_word_loop_dn -$aligned_word_loop: +$aligned_word_loop_dn: ldq $1,-8($5) nop lda $5,-8($5) @@ -63,22 +67,22 @@ $aligned_word_loop: stq $1,-8($4) nop lda $4,-8($4) - bge $18,$aligned_word_loop + bge $18,$aligned_word_loop_dn -$skip_aligned_word_loop: +$skip_aligned_word_loop_dn: lda $18,8($18) - bgt $18,$byte_loop_tail + bgt $18,$byte_loop_tail_dn unop ret $31,($26),1 .align 4 -$misaligned: +$misaligned_dn: nop fnop unop beq $18,$egress -$byte_loop_tail: +$byte_loop_tail_dn: ldq_u $3,-1($5) ldq_u $2,-1($4) lda $5,-1($5) @@ -91,8 +95,77 @@ $byte_loop_tail: bis $1,$2,$1 stq_u $1,0($4) + bgt $18,$byte_loop_tail_dn + br $egress + +$memmove_up: + mov $16,$4 + mov $17,$5 + bne $2,$misaligned_up + beq $1,$skip_aligned_byte_loop_head_up + +$aligned_byte_loop_head_up: + unop + ble $18,$egress + ldq_u $3,0($5) + ldq_u $2,0($4) + + lda $18,-1($18) + extbl $3,$5,$1 + insbl $1,$4,$1 + mskbl $2,$4,$2 + + bis $1,$2,$1 + lda $5,1($5) + stq_u $1,0($4) + lda $4,1($4) + + and $4,7,$6 + bne $6,$aligned_byte_loop_head_up + +$skip_aligned_byte_loop_head_up: + lda $18,-8($18) + blt $18,$skip_aligned_word_loop_up + +$aligned_word_loop_up: + ldq $1,0($5) + nop + lda $5,8($5) + lda $18,-8($18) + + stq $1,0($4) + nop + lda $4,8($4) + bge $18,$aligned_word_loop_up + +$skip_aligned_word_loop_up: + lda $18,8($18) + bgt $18,$byte_loop_tail_up + unop + ret $31,($26),1 + + .align 4 +$misaligned_up: + nop + fnop + unop + beq $18,$egress + +$byte_loop_tail_up: + ldq_u $3,0($5) + ldq_u $2,0($4) + lda $18,-1($18) + extbl $3,$5,$1 + + insbl $1,$4,$1 + mskbl $2,$4,$2 + bis $1,$2,$1 + stq_u $1,0($4) + + lda $5,1($5) + lda $4,1($4) nop - bgt $18,$byte_loop_tail + bgt $18,$byte_loop_tail_up $egress: ret $31,($26),1 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] Please read the FAQ at http://www.tux.org/lkml/
memmove() in 2.4.0-test12, alpha platform
Hello ! New (since test12) optimized memmove function seems to be broken on alpha platform. If dest and src arguments are misaligned, new memmove does wrong things. example: static char p[] = "abcdefghijklmnopkrstuvwxyz01234567890"; memmove(p + 2, p + 13, 17); printk ("DEBUG: memmove test: %s\n", p); produces: DEBUG: memmove test: abyz0123tuvwxyz0123tuvwxyz01234567890 Old memmove variant didn't have this problem. Thanks, Alex. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] Please read the FAQ at http://www.tux.org/lkml/
memmove() in 2.4.0-test12, alpha platform
Hello ! New (since test12) optimized memmove function seems to be broken on alpha platform. If dest and src arguments are misaligned, new memmove does wrong things. example: static char p[] = "abcdefghijklmnopkrstuvwxyz01234567890"; memmove(p + 2, p + 13, 17); printk ("DEBUG: memmove test: %s\n", p); produces: DEBUG: memmove test: abyz0123tuvwxyz0123tuvwxyz01234567890 Old memmove variant didn't have this problem. Thanks, Alex. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] Please read the FAQ at http://www.tux.org/lkml/