#include <machine/asm.h>
RCSID("$NetBSD: cpu_in_cksum.S,v 1.13 2022/10/20 06:58:38 skrll Exp $")
#include "assym.h"
ENTRY(cpu_in_cksum)
push {r4-r11,lr}
mov r8, r3
mov r9, r1
mov ip, r0
.Lin_cksum_skip_loop:
ldr r1, [ip, #(M_LEN)]
ldr r0, [ip, #(M_DATA)]
ldr ip, [ip, #(M_NEXT)]
.Lin_cksum_skip_entry:
subs r2, r2, r1
ble .Lin_cksum_skip_done
cmp ip, #0x00
bne .Lin_cksum_skip_loop
b .Lin_cksum_whoops
.Lin_cksum_skip_done:
add r0, r2, r0
add r0, r0, r1
rsb r1, r2, #0x00
mov r10, #0x00
b .Lin_cksum_entry
.Lin_cksum_loop:
ldr r1, [ip, #(M_LEN)]
ldr r0, [ip, #(M_DATA)]
ldr ip, [ip, #(M_NEXT)]
.Lin_cksum_entry:
cmp r9, r1
#ifdef __thumb__
bge 1f
mov r1, r9
#else
movlt r1, r9
#endif
1: sub r9, r9, r1
eor r11, r10, r0
add r10, r10, r1
adds r2, r1, #0x00
#ifdef __thumb__
it ne
#endif
blne _ASM_LABEL(arm_cksumdata)
tst r11, #0x01
#ifdef __thumb__
it ne
#endif
movne r2, r2, ror #8
adds r8, r8, r2
adc r8, r8, #0x00
cmp ip, #00
bne .Lin_cksum_loop
#ifdef __thumb__
mov r0, r8
lsls r2, r0, #16
adds r0, r0, r2
bcc 1f
adds r0, r0, #65536
1: mvns r0, r0
lsrs r0, r0, #16
#else
adds r8, r8, r8, lsl #16
addcs r8, r8, #65536
mvn r0, r8
lsr r0, r0, #16
#endif
pop {r4-r11, pc}
.Lin_cksum_whoops:
adr r0, .Lin_cksum_whoops_str
bl _C_LABEL(panic)
.Lin_cksum_whoops_str:
.asciz "in_cksum: out of mbufs\n"
.p2align 5
END(cpu_in_cksum)
ASENTRY_NP(arm_cksumdata)
#ifdef __XSCALE__
pld [r0]
#endif
movs r2, #0
ands r7, r0, #0x03
beq .Lcksumdata_wordaligned
eors r0, r0, r7
ldr r2, [r0], #0x04
#ifdef __thumb__
movs r4, r7
lsls r4, r4, #3
#else
lsl r4, r7, #3
#endif
#if defined(__ARMEB__)
lsls r2, r2, r4
lsrs r2, r2, r4
#else
lsrs r2, r2, r4
lsls r2, r2, r4
#endif
rsb r7, r7, #0x04
subs r1, r1, r7
bgt .Lcksumdata_wordaligned
RETc(eq)
adds r1, r1, r7
subs r7, r7, r1
lsls r7, r7, #3
#if defined(__ARMEB__)
lsrs r2, r2, r7
lsls r2, r2, r7
#else
lsls r2, r2, r7
lsrs r2, r2, r7
#endif
RET
.Lcksumdata_wordaligned:
#ifdef __XSCALE__
cmp r1, #0x04
blt .Lcksumdata_endgame
ands r7, r0, #0x04
ldrne r7, [r0], #0x04
subne r1, r1, #0x04
subs r1, r1, #0x40
blt .Lcksumdata_bigloop_end
ldrd r4, r5, [r0], #0x08
mov r6, #0x00
.Lcksumdata_bigloop:
pld [r0, #0x18]
adds r2, r2, r6
adcs r2, r2, r7
ldrd r6, r7, [r0], #0x08
adcs r2, r2, r4
adcs r2, r2, r5
ldrd r4, r5, [r0], #0x08
adcs r2, r2, r6
adcs r2, r2, r7
ldrd r6, r7, [r0], #0x08
adcs r2, r2, r4
adcs r2, r2, r5
ldrd r4, r5, [r0], #0x08
adcs r2, r2, r6
adcs r2, r2, r7
pld [r0, #0x18]
ldrd r6, r7, [r0], #0x08
adcs r2, r2, r4
adcs r2, r2, r5
ldrd r4, r5, [r0], #0x08
adcs r2, r2, r6
adcs r2, r2, r7
ldrd r6, r7, [r0], #0x08
adcs r2, r2, r4
adcs r2, r2, r5
adcs r2, r2, #0x00
subs r1, r1, #0x40
ldrdge r4, r5, [r0], #0x08
bge .Lcksumdata_bigloop
adds r2, r2, r6
.Lcksumdata_bigloop_end:
adcs r2, r2, r7
adcs r2, r2, #0x00
#else
subs r1, r1, #0x40
blt .Lcksumdata_bigloop_end
.Lcksumdata_bigloop:
ldmia r0!, {r3, r4, r5, r6}
adds r2, r2, r3
adcs r2, r2, r4
adcs r2, r2, r5
ldmia r0!, {r3, r4, r5, r7}
adcs r2, r2, r6
adcs r2, r2, r3
adcs r2, r2, r4
adcs r2, r2, r5
ldmia r0!, {r3, r4, r5, r6}
adcs r2, r2, r7
adcs r2, r2, r3
adcs r2, r2, r4
adcs r2, r2, r5
ldmia r0!, {r3, r4, r5, r7}
adcs r2, r2, r6
adcs r2, r2, r3
adcs r2, r2, r4
adcs r2, r2, r5
adcs r2, r2, r7
adcs r2, r2, #0x00
subs r1, r1, #0x40
bge .Lcksumdata_bigloop
.Lcksumdata_bigloop_end:
#endif
adds r1, r1, #0x40
RETc(eq)
cmp r1, #0x20
#ifdef __XSCALE__
ldrdge r4, r5, [r0], #0x08
blt .Lcksumdata_less_than_32
pld [r0, #0x18]
ldrd r6, r7, [r0], #0x08
adds r2, r2, r4
adcs r2, r2, r5
ldrd r4, r5, [r0], #0x08
adcs r2, r2, r6
adcs r2, r2, r7
ldrd r6, r7, [r0], #0x08
adcs r2, r2, r4
adcs r2, r2, r5
adcs r2, r2, r6
adcs r2, r2, r7
#else
blt .Lcksumdata_less_than_32
ldmia r0!, {r3, r4, r5, r6}
adds r2, r2, r3
adcs r2, r2, r4
adcs r2, r2, r5
ldmia r0!, {r3, r4, r5, r7}
adcs r2, r2, r6
adcs r2, r2, r3
adcs r2, r2, r4
adcs r2, r2, r5
adcs r2, r2, r7
#endif
adcs r2, r2, #0x00
subs r1, r1, #0x20
RETc(eq)
.Lcksumdata_less_than_32:
and r3, r1, #0x18
rsb r4, r3, #0x18
subs r1, r1, r3
adds r4, r4, r4, lsr #1
#ifdef __thumb__
it ne
#endif
addne pc, pc, r4
ldmia r0!, {r4, r5}
nop
adcs r2, r2, r4
adcs r2, r2, r5
ldmia r0!, {r4, r5}
adcs r2, r2, r4
adcs r2, r2, r5
ldmia r0!, {r4, r5}
adcs r2, r2, r4
adcs r2, r2, r5
adcs r2, r2, #0x00
subs r1, r1, #0x04
blt .Lcksumdata_lessthan4
ldr r4, [r0], #0x04
subs r1, r1, #0x04
adds r2, r2, r4
adcs r2, r2, #0x00
.Lcksumdata_lessthan4:
adds r1, r1, #0x04
RETc(eq)
.Lcksumdata_endgame:
ldr r3, [r0]
rsb r1, r1, #4
lsl r1, r1, #3
#ifdef __ARMEB__
lsr r3, r3, r1
lsl r3, r3, r1
#else
lsl r3, r3, r1
lsr r3, r3, r1
#endif
adds r2, r2, r3
adcs r2, r2, #0x00
RET
ASEND(arm_cksumdata)