#include <aarch64/asm.h>
#include "assym.h"
RCSID("$NetBSD: bus_space_asm_generic.S,v 1.7 2024/02/07 04:20:26 msaitoh Exp $")
.macro generate_bsfunc funcname, dsbop
ENTRY_NP(\funcname\()_bs_r_1)
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
ldrb w0, [x1, x8]
ret
END(\funcname\()_bs_r_1)
ENTRY_NP(\funcname\()_bs_r_2)
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
ldrh w0, [x1, x8]
ret
END(\funcname\()_bs_r_2)
ENTRY_NP(\funcname\()_bs_r_4)
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
ldr w0, [x1, x8]
ret
END(\funcname\()_bs_r_4)
ENTRY_NP(\funcname\()_bs_r_8)
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
ldr x0, [x1, x8]
ret
END(\funcname\()_bs_r_8)
ENTRY_NP(\funcname\()_bs_r_2_swap)
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
ldrh w0, [x1, x8]
rev16 w0, w0
ret
END(\funcname\()_bs_r_2_swap)
ENTRY_NP(\funcname\()_bs_r_4_swap)
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
ldr w0, [x1, x8]
rev w0, w0
ret
END(\funcname\()_bs_r_4_swap)
ENTRY_NP(\funcname\()_bs_r_8_swap)
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
ldr x0, [x1, x8]
rev x0, x0
ret
END(\funcname\()_bs_r_8_swap)
ENTRY_NP(\funcname\()_bs_rm_1)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldrb w9, [x1, x8]
subs x4, x4, #1
strb w9, [x3], #1
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rm_1: count == 0"
#endif
END(\funcname\()_bs_rm_1)
ENTRY_NP(\funcname\()_bs_rm_2)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldrh w9, [x1, x8]
subs x4, x4, #1
strh w9, [x3], #2
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rm_2: count == 0"
#endif
END(\funcname\()_bs_rm_2)
ENTRY_NP(\funcname\()_bs_rm_4)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldr w9, [x1, x8]
subs x4, x4, #1
str w9, [x3], #4
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rm_4: count == 0"
#endif
END(\funcname\()_bs_rm_4)
ENTRY_NP(\funcname\()_bs_rm_8)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldr x9, [x1, x8]
subs x4, x4, #1
str x9, [x3], #8
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rm_8: count == 0"
#endif
END(\funcname\()_bs_rm_8)
ENTRY_NP(\funcname\()_bs_rm_2_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldrh w9, [x1, x8]
subs x4, x4, #1
rev16 w9, w9
strh w9, [x3], #2
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rm_2_swap: count == 0"
#endif
END(\funcname\()_bs_rm_2_swap)
ENTRY_NP(\funcname\()_bs_rm_4_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldr w9, [x1, x8]
subs x4, x4, #1
rev w9, w9
str w9, [x3], #4
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rm_4_swap: count == 0"
#endif
END(\funcname\()_bs_rm_4_swap)
ENTRY_NP(\funcname\()_bs_rm_8_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldr x9, [x1, x8]
subs x4, x4, #1
rev x9, x9
str x9, [x3], #8
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rm_8_swap: count == 0"
#endif
END(\funcname\()_bs_rm_8_swap)
ENTRY_NP(\funcname\()_bs_rr_1)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
lsl x2, x2, x8
1:
ldrb w8, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
strb w8, [x3], #1
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rr_1: count == 0"
#endif
END(\funcname\()_bs_rr_1)
ENTRY_NP(\funcname\()_bs_rr_2)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #2
bcs 0f
mov x9, #2
0:
lsl x2, x2, x8
1:
ldrh w8, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
strh w8, [x3], #2
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rr_2: count == 0"
#endif
END(\funcname\()_bs_rr_2)
ENTRY_NP(\funcname\()_bs_rr_4)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #4
bcs 0f
mov x9, #4
0:
lsl x2, x2, x8
1:
ldr w8, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
str w8, [x3], #4
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rr_4: count == 0"
#endif
END(\funcname\()_bs_rr_4)
ENTRY_NP(\funcname\()_bs_rr_8)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #8
bcs 0f
mov x9, #8
0:
lsl x2, x2, x8
1:
ldr x8, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
str x8, [x3], #8
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rr_8: count == 0"
#endif
END(\funcname\()_bs_rr_8)
ENTRY_NP(\funcname\()_bs_rr_2_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #2
bcs 0f
mov x9, #2
0:
lsl x2, x2, x8
1:
ldrh w8, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
rev16 w8, w8
strh w8, [x3], #2
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rr_2_swap: count == 0"
#endif
END(\funcname\()_bs_rr_2_swap)
ENTRY_NP(\funcname\()_bs_rr_4_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #4
bcs 0f
mov x9, #4
0:
lsl x2, x2, x8
1:
ldr w8, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
rev w8, w8
str w8, [x3], #4
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rr_4_swap: count == 0"
#endif
END(\funcname\()_bs_rr_4_swap)
ENTRY_NP(\funcname\()_bs_rr_8_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
\dsbop
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #8
bcs 0f
mov x9, #8
0:
lsl x2, x2, x8
1:
ldr x8, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
rev x8, x8
str x8, [x3], #8
b.ne 1b
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_rr_8_swap: count == 0"
#endif
END(\funcname\()_bs_rr_8_swap)
ENTRY_NP(\funcname\()_bs_sm_1)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
subs x4, x4, #1
strb w3, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_sm_1: count == 0"
#endif
END(\funcname\()_bs_sm_1)
ENTRY_NP(\funcname\()_bs_sm_2_swap)
rev16 w3, w3
ENTRY_NP(\funcname\()_bs_sm_2)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
subs x4, x4, #1
strh w3, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_sm_2(_swap): count == 0"
#endif
END(\funcname\()_bs_sm_2)
END(\funcname\()_bs_sm_2_swap)
ENTRY_NP(\funcname\()_bs_sm_4_swap)
rev w3, w3
ENTRY_NP(\funcname\()_bs_sm_4)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
subs x4, x4, #1
str w3, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_sm_4(_swap): count == 0"
#endif
END(\funcname\()_bs_sm_4)
END(\funcname\()_bs_sm_4_swap)
ENTRY_NP(\funcname\()_bs_sm_8_swap)
rev x3, x3
ENTRY_NP(\funcname\()_bs_sm_8)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
subs x4, x4, #1
str x3, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_sm_8(_swap): count == 0"
#endif
END(\funcname\()_bs_sm_8)
END(\funcname\()_bs_sm_8_swap)
ENTRY_NP(\funcname\()_bs_w_1)
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
strb w3, [x1, x8]
\dsbop
ret
END(\funcname\()_bs_w_1)
ENTRY_NP(\funcname\()_bs_w_2_swap)
rev16 w3, w3
ENTRY_NP(\funcname\()_bs_w_2)
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
strh w3, [x1, x8]
\dsbop
ret
END(\funcname\()_bs_w_2)
END(\funcname\()_bs_w_2_swap)
ENTRY_NP(\funcname\()_bs_w_4_swap)
rev w3, w3
ENTRY_NP(\funcname\()_bs_w_4)
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
str w3, [x1, x8]
\dsbop
ret
END(\funcname\()_bs_w_4)
END(\funcname\()_bs_w_4_swap)
ENTRY_NP(\funcname\()_bs_w_8_swap)
rev x3, x3
ENTRY_NP(\funcname\()_bs_w_8)
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
str x3, [x1, x8]
\dsbop
ret
END(\funcname\()_bs_w_8)
END(\funcname\()_bs_w_8_swap)
ENTRY_NP(\funcname\()_bs_wm_1)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldrb w9, [x3], #1
subs x4, x4, #1
strb w9, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wm_1: count == 0"
#endif
END(\funcname\()_bs_wm_1)
ENTRY_NP(\funcname\()_bs_wm_2)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldrh w9, [x3], #2
subs x4, x4, #1
strh w9, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wm_2: count == 0"
#endif
END(\funcname\()_bs_wm_2)
ENTRY_NP(\funcname\()_bs_wm_4)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldr w9, [x3], #4
subs x4, x4, #1
str w9, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wm_4: count == 0"
#endif
END(\funcname\()_bs_wm_4)
ENTRY_NP(\funcname\()_bs_wm_8)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldr x9, [x3], #8
subs x4, x4, #1
str x9, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wm_8: count == 0"
#endif
END(\funcname\()_bs_wm_8)
ENTRY_NP(\funcname\()_bs_wm_2_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldrh w9, [x3], #2
subs x4, x4, #1
rev16 w9, w9
strh w9, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wm_2_swap: count == 0"
#endif
END(\funcname\()_bs_wm_2_swap)
ENTRY_NP(\funcname\()_bs_wm_4_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldr w9, [x3], #4
subs x4, x4, #1
rev w9, w9
str w9, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wm_4_swap: count == 0"
#endif
END(\funcname\()_bs_wm_4_swap)
ENTRY_NP(\funcname\()_bs_wm_8_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x8, x2, x8
1:
ldr x9, [x3], #8
subs x4, x4, #1
rev x9, x9
str x9, [x1, x8]
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wm_8_swap: count == 0"
#endif
END(\funcname\()_bs_wm_8_swap)
ENTRY_NP(\funcname\()_bs_wr_1)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
lsl x2, x2, x8
1:
ldrb w8, [x3], #1
subs x4, x4, #1
strb w8, [x1, x2]
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wr_1: count == 0"
#endif
END(\funcname\()_bs_wr_1)
ENTRY_NP(\funcname\()_bs_wr_2)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #2
bcs 0f
mov x9, #2
0:
lsl x2, x2, x8
1:
ldrh w8, [x3], #2
subs x4, x4, #1
strh w8, [x1, x2]
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wr_2: count == 0"
#endif
END(\funcname\()_bs_wr_2)
ENTRY_NP(\funcname\()_bs_wr_4)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #4
bcs 0f
mov x9, #4
0:
lsl x2, x2, x8
1:
ldr w8, [x3], #4
subs x4, x4, #1
str w8, [x1, x2]
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wr_4: count == 0"
#endif
END(\funcname\()_bs_wr_4)
ENTRY_NP(\funcname\()_bs_wr_8)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #8
bcs 0f
mov x9, #8
0:
lsl x2, x2, x8
1:
ldr x8, [x3], #8
subs x4, x4, #1
str x8, [x1, x2]
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wr_8: count == 0"
#endif
END(\funcname\()_bs_wr_8)
ENTRY_NP(\funcname\()_bs_wr_2_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #2
bcs 0f
mov x9, #2
0:
lsl x2, x2, x8
1:
ldrh w8, [x3], #2
rev16 w8, w8
subs x4, x4, #1
strh w8, [x1, x2]
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wr_2_swap: count == 0"
#endif
END(\funcname\()_bs_wr_2_swap)
ENTRY_NP(\funcname\()_bs_wr_4_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #4
bcs 0f
mov x9, #4
0:
lsl x2, x2, x8
1:
ldr w8, [x3], #4
rev w8, w8
subs x4, x4, #1
str w8, [x1, x2]
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wr_4_swap: count == 0"
#endif
END(\funcname\()_bs_wr_4_swap)
ENTRY_NP(\funcname\()_bs_wr_8_swap)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #8
bcs 0f
mov x9, #8
0:
lsl x2, x2, x8
1:
ldr x8, [x3], #8
rev x8, x8
subs x4, x4, #1
str x8, [x1, x2]
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_wr_8_swap: count == 0"
#endif
END(\funcname\()_bs_wr_8_swap)
ENTRY_NP(\funcname\()_bs_sr_1)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
lsl x2, x2, x8
1:
strb w3, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_sr_1: count == 0"
#endif
END(\funcname\()_bs_sr_1)
ENTRY_NP(\funcname\()_bs_sr_2_swap)
rev16 w3, w3
ENTRY_NP(\funcname\()_bs_sr_2)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #2
bcs 0f
mov x9, #2
0:
lsl x2, x2, x8
1:
strh w3, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_sr_2(_swap): count == 0"
#endif
END(\funcname\()_bs_sr_2)
END(\funcname\()_bs_sr_2_swap)
ENTRY_NP(\funcname\()_bs_sr_4_swap)
rev w3, w3
ENTRY_NP(\funcname\()_bs_sr_4)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #4
bcs 0f
mov x9, #4
0:
lsl x2, x2, x8
1:
str w3, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_sr_4(_swap): count == 0"
#endif
END(\funcname\()_bs_sr_4)
END(\funcname\()_bs_sr_4_swap)
ENTRY_NP(\funcname\()_bs_sr_8_swap)
rev x3, x3
ENTRY_NP(\funcname\()_bs_sr_8)
#ifdef DIAGNOSTIC
cbz x4, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
mov x9, #1
lsl x9, x9, x8
cmp x9, #8
bcs 0f
mov x9, #8
0:
lsl x2, x2, x8
1:
str x3, [x1, x2]
subs x4, x4, #1
add x2, x2, x9
b.ne 1b
\dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_sr_8(_swap): count == 0"
#endif
END(\funcname\()_bs_sr_8)
END(\funcname\()_bs_sr_8_swap)
ENTRY_NP(\funcname\()_bs_c_1)
#ifdef DIAGNOSTIC
cbz x5, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x2, x2, x8
lsl x4, x4, x8
add x1, x1, x2
add x3, x3, x4
mov x10, #1
lsl x10, x10, x8
cmp x1, x3
b.cc 2f
1:
ldrb w9, [x1]
subs x5, x5, #1
strb w9, [x3]
add x1, x1, x10
add x3, x3, x10
b.ne 1b
b 8f
2:
lsl x8, x5, x8
add x1, x1, x8
add x3, x3, x8
3:
sub x1, x1, x10
sub x3, x3, x10
ldrb w9, [x1]
subs x5, x5, #1
strb w9, [x3]
b.ne 3b
8: \dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_c_1: count == 0"
#endif
END(\funcname\()_bs_c_1)
ENTRY_NP(\funcname\()_bs_c_2)
#ifdef DIAGNOSTIC
cbz x5, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x2, x2, x8
lsl x4, x4, x8
add x1, x1, x2
add x3, x3, x4
mov x10, #1
lsl x10, x10, x8
cmp x10, #2
bcs 0f
mov x10, #2
0:
cmp x1, x3
b.cc 2f
1:
ldrh w9, [x1]
subs x5, x5, #1
strh w9, [x3]
add x1, x1, x10
add x3, x3, x10
b.ne 1b
b 8f
2:
mul x8, x5, x10
add x1, x1, x8
add x3, x3, x8
3:
sub x1, x1, x10
sub x3, x3, x10
ldrh w9, [x1]
subs x5, x5, #1
strh w9, [x3]
b.ne 3b
8: \dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_c_2: count == 0"
#endif
END(\funcname\()_bs_c_2)
ENTRY_NP(\funcname\()_bs_c_4)
#ifdef DIAGNOSTIC
cbz x5, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x2, x2, x8
lsl x4, x4, x8
add x1, x1, x2
add x3, x3, x4
mov x10, #1
lsl x10, x10, x8
cmp x10, #4
bcs 0f
mov x10, #4
0:
cmp x1, x3
b.cc 2f
1:
ldr w9, [x1]
subs x5, x5, #1
str w9, [x3]
add x1, x1, x10
add x3, x3, x10
b.ne 1b
b 8f
2:
mul x8, x5, x10
add x1, x1, x5
add x3, x3, x5
3:
sub x1, x1, x10
sub x3, x3, x10
ldr w9, [x1]
subs x5, x5, #1
str w9, [x3]
b.ne 3b
8: \dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_c_4: count == 0"
#endif
END(\funcname\()_bs_c_4)
ENTRY_NP(\funcname\()_bs_c_8)
#ifdef DIAGNOSTIC
cbz x5, 99f
#endif
ldr w8, [x0, #BS_STRIDE]
lsl x2, x2, x8
lsl x4, x4, x8
add x1, x1, x2
add x3, x3, x4
mov x10, #1
lsl x10, x10, x8
cmp x10, #8
bcs 0f
mov x10, #8
0:
cmp x1, x3
b.cc 2f
1:
ldr x9, [x1]
subs x5, x5, #1
str x9, [x3]
add x1, x1, x10
add x3, x3, x10
b.ne 1b
b 8f
2:
mul x8, x5, x10
add x1, x1, x8
add x3, x3, x8
3:
sub x1, x1, x10
sub x3, x3, x10
ldr x9, [x1]
subs x5, x5, #1
str x9, [x3]
b.ne 3b
8: \dsbop
ret
#ifdef DIAGNOSTIC
99: adr x0, 100f
b _C_LABEL(panic)
100: .asciz "\funcname\()_bs_c_8: count == 0"
#endif
END(\funcname\()_bs_c_8)
.endm
generate_bsfunc generic
generate_bsfunc generic_dsb, "dsb sy"