[xtensa-cvscommit] linux/arch/xtensa/lib checksum.S,1.3,1.4
Brought to you by:
zankel
|
From: <joe...@us...> - 2002-11-08 23:17:46
|
Update of /cvsroot/xtensa/linux/arch/xtensa/lib In directory usw-pr-cvs1:/tmp/cvs-serv31798/arch/xtensa/lib Modified Files: checksum.S Log Message: csum_partial() now handles odd addresses properly, just to be safe. Index: checksum.S =================================================================== RCS file: /cvsroot/xtensa/linux/arch/xtensa/lib/checksum.S,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** checksum.S 8 Nov 2002 01:44:00 -0000 1.3 --- checksum.S 8 Nov 2002 23:17:41 -0000 1.4 *************** *** 117,125 **** beqz a3, 7b /* branch if len == 0 */ beqi a3, 1, 6b /* branch if len == 1 */ ! l16ui a6, a2, 0 /* common case, len == 2 */ ONES_ADD(a4, a6) addi a2, a2, 2 /* adjust buf */ addi a3, a3, -2 /* adjust len */ j 1b /* now buf is 4-byte aligned */ --- 117,174 ---- beqz a3, 7b /* branch if len == 0 */ beqi a3, 1, 6b /* branch if len == 1 */ ! ! extui a5, a2, 0, 1 ! bnez a5, 8f /* branch if 1-byte aligned */ ! ! l16ui a6, a2, 0 /* common case, len >= 2 */ ONES_ADD(a4, a6) addi a2, a2, 2 /* adjust buf */ addi a3, a3, -2 /* adjust len */ j 1b /* now buf is 4-byte aligned */ + + /* case: odd-byte aligned, len > 1 + * This case is dog slow, so don't give us an odd address. + * (I don't think this ever happens, but just in case.) + */ + 8: + srli a5, a3, 2 /* 4-byte chunks */ + #if XCHAL_HAVE_LOOPS + loopgtz a5, 2f + #else + beqz a5, 2f + slli a5, a5, 2 + add a5, a5, a2 /* a5 = end of last 4-byte chunk */ + .Loop3: + #endif + l8ui a6, a2, 0 /* bits 24..31 */ + l16ui a7, a2, 1 /* bits 8..23 */ + l8ui a8, a2, 3 /* bits 0.. 8 */ + #ifdef __XTENSA_EB__ + slli a6, a6, 24 + #else + slli a8, a8, 24 + #endif + slli a7, a7, 8 + or a7, a7, a6 + or a7, a7, a8 + ONES_ADD(a4, a7) + addi a2, a2, 4 + #if !XCHAL_HAVE_LOOPS + blt a2, a5, .Loop3 + #endif + 2: + _bbci.l a3, 1, 3f /* remaining 2-byte chunk, still odd addr */ + l8ui a6, a2, 0 + l8ui a7, a2, 1 + #ifdef __XTENSA_EB__ + slli a6, a6, 8 + #else + slli a7, a7, 8 + #endif + or a7, a7, a6 + ONES_ADD(a4, a7) + addi a2, a2, 2 + 3: + j 5b /* branch to handle the remaining byte */ |