YAHAL
Yet Another Hardware Abstraction Library
Loading...
Searching...
No Matches
bit_ops_aeabi.S
1/*
2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7.syntax unified
8.cpu cortex-m0plus
9.thumb
10
11#include "asm_helper.S"
12#include "bootrom.h"
13
14__pre_init __aeabi_bits_init, 00010
15
16.macro bits_section name
17#if PICO_BITS_IN_RAM
18.section RAM_SECTION_NAME(\name), "ax"
19#else
20.section SECTION_NAME(\name), "ax"
21#endif
22.endm
23
24.section .data.aeabi_bits_funcs
25.global aeabi_bits_funcs, aeabi_bits_funcs_end
26
27.equ BITS_FUNC_COUNT, 4
28.align 4
29aeabi_bits_funcs:
30 .word ROM_FUNC_POPCOUNT32
31 .word ROM_FUNC_CLZ32
32 .word ROM_FUNC_CTZ32
33 .word ROM_FUNC_REVERSE32
34aeabi_bits_funcs_end:
35
36.section .text
37.thumb_func
38__aeabi_bits_init:
39 ldr r0, =aeabi_bits_funcs
40 movs r1, #BITS_FUNC_COUNT
41 ldr r3, =rom_funcs_lookup
42 bx r3
43
44.equ POPCOUNT32, 0
45.equ CLZ32, 4
46.equ CTZ32, 8
47.equ REVERSE32, 12
48
49bits_section clzsi
50wrapper_func __clz
51wrapper_func __clzl
52wrapper_func __clzsi2
53 ldr r3, =aeabi_bits_funcs
54 ldr r3, [r3, #CLZ32]
55 bx r3
56
57bits_section ctzsi
58wrapper_func __ctzsi2
59 ldr r3, =aeabi_bits_funcs
60 ldr r3, [r3, #CTZ32]
61 bx r3
62
63bits_section popcountsi
64wrapper_func __popcountsi2
65 ldr r3, =aeabi_bits_funcs
66 ldr r3, [r3, #POPCOUNT32]
67 bx r3
68
69bits_section clzdi
70wrapper_func __clzll
71wrapper_func __clzdi2
72 ldr r3, =aeabi_bits_funcs
73 ldr r3, [r3, #CLZ32]
74 cmp r1, #0
75 bne 1f
76 push {lr}
77 blx r3
78 adds r0, #32
79 pop {pc}
801:
81 mov r0, r1
82 bx r3
83
84bits_section ctzdi
85wrapper_func __ctzdi2
86 ldr r3, =aeabi_bits_funcs
87 ldr r3, [r3, #CTZ32]
88 cmp r0, #0
89 beq 1f
90 bx r3
911:
92 push {lr}
93 mov r0, r1
94 blx r3
95 adds r0, #32
96 pop {pc}
97
98bits_section popcountdi
99wrapper_func __popcountdi2
100 ldr r3, =aeabi_bits_funcs
101 ldr r3, [r3, #POPCOUNT32]
102 push {r1, r3, lr}
103 blx r3
104 mov ip, r0
105 pop {r0, r3}
106 blx r3
107 mov r1, ip
108 add r0, r1
109 pop {pc}
110
111bits_section reverse32
112regular_func reverse32
113 ldr r3, =aeabi_bits_funcs
114 ldr r3, [r3, #REVERSE32]
115 bx r3
116
117bits_section __rev
118regular_func __rev
119regular_func __revl
120 ldr r3, =aeabi_bits_funcs
121 ldr r3, [r3, #REVERSE32]
122 bx r3
123
124bits_section __revll
125regular_func __revll
126 push {lr}
127 ldr r3, =aeabi_bits_funcs
128 ldr r3, [r3, #REVERSE32]
129 push {r1, r3}
130 blx r3
131 mov ip, r0 // reverse32 preserves ip
132 pop {r0, r3}
133 blx r3
134 mov r1, ip
135 pop {pc}