1 #include <machine/asm.h>
6 * a1: length of the area to checksum
18 .macro CSUM_BIGCHUNK_AND_COPY offset
19 pref 0, (\offset+0x0)(a0)
20 ld t0, (\offset+0x00)(a0)
21 ld t1, (\offset+0x08)(a0)
22 .word 0x70481038 /*daddwc v0, v0, t0 */
23 .word 0x70491038 /*daddwc v0, v0, t1 */
24 ld t0, (\offset + 0x10)(a0)
25 ld t1, (\offset + 0x18)(a0)
26 .word 0x70481038 /* daddwc v0, v0, t0 */
27 .word 0x70491038 /*daddwc v0, v0, t1 */
30 small_csumcpy: /* unknown src alignment and < 8 bytes to go */
37 ulw t1, (src) /* Still a full word to go */
39 .word 0x70491038 /*daddwc v0, v0, t1 */
45 ulhu t1, (src) /* Still a halfword to go */
59 1: .word 0x70491038 /*daddwc v0, v0, t1 */
61 .word 0x70461038 /*daddwc v0, v0, a2 */
62 .word 0x70401038 /*daddwc v0, v0, $0 */
64 /* Ideally at this point of time the status flag must be cleared */
67 .word 0x70431038 /*daddwc v0, v0, v1 */
69 .word 0x70401038 /*daddwc v0, v0, zero */
71 /* fold the checksum */
82 /* ------------------------------------------------------------------ */
85 LEAF(xlr_csum_partial_nocopy)
90 bnez t8, small_csumcpy /* < 8 bytes to copy */
94 andi t7, src, 0x1 /* odd buffer? */
102 .word 0x70481038 /*daddwc v0, v0, t0 */
112 .word 0x70481038 /*daddwc v0, v0, t0 */
117 bnez t8, do_end_words
126 .word 0x70481038 /*daddwc v0, v0, t0 */
136 .word 0x70481038 /*daddwc v0, v0, t0 */
141 beqz t8, begin_movement
146 .word 0x704b1038 /*daddwc v0, v0, t3 */
147 .word 0x70481038 /*daddwc v0, v0, t0 */
160 CSUM_BIGCHUNK_AND_COPY(0x00)
161 CSUM_BIGCHUNK_AND_COPY(0x20)
162 CSUM_BIGCHUNK_AND_COPY(0x40)
163 CSUM_BIGCHUNK_AND_COPY(0x60)
165 bnez t8, move_128bytes /* flag */
175 CSUM_BIGCHUNK_AND_COPY(0x00)
176 CSUM_BIGCHUNK_AND_COPY(0x20)
180 beqz t2, do_end_words
185 CSUM_BIGCHUNK_AND_COPY(0x00)
190 beqz t8, maybe_end_cruft
196 .word 0x70481038 /*daddwc v0, v0, t0 */
204 j small_csumcpy; move a1, t2
217 END(xlr_csum_partial_nocopy)