Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
af0d3bda
T
Third Party Musl
项目概览
OpenHarmony
/
Third Party Musl
1 年多 前同步成功
通知
37
Star
125
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Musl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
af0d3bda
编写于
6月 08, 2022
作者:
O
openharmony_ci
提交者:
Gitee
6月 08, 2022
浏览文件
操作
浏览文件
下载
差异文件
!321 fix:字符串函数补充优化
Merge pull request !321 from Zhaotianyu/0607libc_opt
上级
2914fc51
85057cd5
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
420 addition
and
1 deletion
+420
-1
porting/liteos_m/kernel/BUILD.gn
porting/liteos_m/kernel/BUILD.gn
+1
-0
porting/liteos_m/kernel/musl.gni
porting/liteos_m/kernel/musl.gni
+3
-0
porting/liteos_m/kernel/src/string/arch/arm/memcpy_le.S
porting/liteos_m/kernel/src/string/arch/arm/memcpy_le.S
+413
-0
porting/liteos_m/kernel/src/string/arch/arm/memset_armv8m.S
porting/liteos_m/kernel/src/string/arch/arm/memset_armv8m.S
+1
-1
porting/liteos_m/kernel/src/string/memcpy.c
porting/liteos_m/kernel/src/string/memcpy.c
+2
-0
未找到文件。
porting/liteos_m/kernel/BUILD.gn
浏览文件 @
af0d3bda
...
...
@@ -60,6 +60,7 @@ static_library(libc) {
]
if (defined(LOSCFG_ARCH_ARM_AARCH32)) {
sources += MUSL_LIBC_OPT_SRC_FOR_ARM
if (LOSCFG_ARCH_ARM_VER == "armv7-m" || LOSCFG_ARCH_ARM_VER == "armv8-m") {
sources -= [
"$MUSLPORTINGDIR/src/string/strcpy.c",
...
...
porting/liteos_m/kernel/musl.gni
浏览文件 @
af0d3bda
...
...
@@ -35,6 +35,9 @@ MUSL_LIBC_OPT_SRC_FOR_ARMV8_M = [
"$MUSLPORTINGDIR/src/string/arch/arm/memset_armv8m.S",
]
MUSL_LIBC_OPT_SRC_FOR_ARM =
[ "$MUSLPORTINGDIR/src/string/arch/arm/memcpy_le.S" ]
MUSL_LIBC_SRC = [
"$MUSLPORTINGDIR/src/ctype/__ctype_get_mb_cur_max.c",
"$MUSLPORTINGDIR/src/ctype/isalnum.c",
...
...
porting/liteos_m/kernel/src/string/arch/arm/memcpy_le.S
0 → 100644
浏览文件 @
af0d3bda
#if !__ARMEB__
/*
*
Copyright
(
C
)
2008
The
Android
Open
Source
Project
*
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
*
are
met
:
*
*
Redistributions
of
source
code
must
retain
the
above
copyright
*
notice
,
this
list
of
conditions
and
the
following
disclaimer
.
*
*
Redistributions
in
binary
form
must
reproduce
the
above
copyright
*
notice
,
this
list
of
conditions
and
the
following
disclaimer
in
*
the
documentation
and
/
or
other
materials
provided
with
the
*
distribution
.
*
*
THIS
SOFTWARE
IS
PROVIDED
BY
THE
COPYRIGHT
HOLDERS
AND
CONTRIBUTORS
*
"AS IS"
AND
ANY
EXPRESS
OR
IMPLIED
WARRANTIES
,
INCLUDING
,
BUT
NOT
*
LIMITED
TO
,
THE
IMPLIED
WARRANTIES
OF
MERCHANTABILITY
AND
FITNESS
*
FOR
A
PARTICULAR
PURPOSE
ARE
DISCLAIMED
.
IN
NO
EVENT
SHALL
THE
*
COPYRIGHT
OWNER
OR
CONTRIBUTORS
BE
LIABLE
FOR
ANY
DIRECT
,
INDIRECT
,
*
INCIDENTAL
,
SPECIAL
,
EXEMPLARY
,
OR
CONSEQUENTIAL
DAMAGES
(
INCLUDING
,
*
BUT
NOT
LIMITED
TO
,
PROCUREMENT
OF
SUBSTITUTE
GOODS
OR
SERVICES
; LOSS
*
OF
USE
,
DATA
,
OR
PROFITS
; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
*
AND
ON
ANY
THEORY
OF
LIABILITY
,
WHETHER
IN
CONTRACT
,
STRICT
LIABILITY
,
*
OR
TORT
(
INCLUDING
NEGLIGENCE
OR
OTHERWISE
)
ARISING
IN
ANY
WAY
OUT
*
OF
THE
USE
OF
THIS
SOFTWARE
,
EVEN
IF
ADVISED
OF
THE
POSSIBILITY
OF
*
SUCH
DAMAGE
.
*/
/*
*
Optimized
memcpy
()
for
ARM
.
*
*
note
that
memcpy
()
always
returns
the
destination
pointer
,
*
so
we
have
to
preserve
R0
.
*/
/*
*
This
file
has
been
modified
from
the
original
for
use
in
musl
libc
.
*
The
main
changes
are
:
addition
of
.
type
memcpy
,%
function
to
make
the
*
code
safely
callable
from
thumb
mode
,
adjusting
the
return
*
instructions
to
be
compatible
with
pre
-
thumb
ARM
cpus
,
removal
of
*
prefetch
code
that
is
not
compatible
with
older
cpus
and
support
for
*
building
as
thumb
2
.
*/
.
syntax
unified
#define FUNCTION(x) \
.
global
x
; \
.
type
x
,%
function
; \
x
:
#if defined(LOSCFG_KERNEL_LMS)
FUNCTION
(
__memcpy
)
#else
FUNCTION
(
memcpy
)
#endif
/
*
The
stack
must
always
be
64
-
bits
aligned
to
be
compliant
with
the
*
ARM
ABI
.
Since
we
have
to
save
R0
,
we
might
as
well
save
R4
*
which
we
can
use
for
better
pipelining
of
the
reads
below
*/
.
fnstart
.
save
{
r0
,
r4
,
lr
}
stmfd
sp
!,
{
r0
,
r4
,
lr
}
/
*
Making
room
for
r5
-
r11
which
will
be
spilled
later
*/
.
pad
#
28
sub
sp
,
sp
,
#
28
/
*
it
simplifies
things
to
take
care
of
len
<
4
early
*/
cmp
r2
,
#
4
blo
copy_last_3_and_return
/
*
compute
the
offset
to
align
the
source
*
offset
=
(
4
-(
src
&3
))
&3
=
-
src
&
3
*/
rsb
r3
,
r1
,
#
0
ands
r3
,
r3
,
#
3
beq
src_aligned
/
*
align
source
to
32
bits
.
We
need
to
insert
2
instructions
between
*
a
ldr
[
b|h] and str[b|h
]
because
byte
and
half
-
word
instructions
*
stall
2
cycles
.
*/
movs
r12
,
r3
,
lsl
#
31
sub
r2
,
r2
,
r3
/*
we
know
that
r3
<=
r2
because
r2
>=
4
*/
itt
mi
ldrbmi
r3
,
[
r1
],
#
1
strbmi
r3
,
[
r0
],
#
1
itttt
cs
ldrbcs
r4
,
[
r1
],
#
1
ldrbcs
r12
,[
r1
],
#
1
strbcs
r4
,
[
r0
],
#
1
strbcs
r12
,[
r0
],
#
1
src_aligned
:
/
*
see
if
src
and
dst
are
aligned
together
(
congruent
)
*/
eor
r12
,
r0
,
r1
tst
r12
,
#
3
bne
non_congruent
/
*
Use
post
-
incriment
mode
for
stm
to
spill
r5
-
r11
to
reserved
stack
*
frame
.
Don
't update sp.
*/
stmea
sp
,
{
r5
-
r11
}
/
*
align
the
destination
to
a
cache
-
line
*/
rsb
r3
,
r0
,
#
0
ands
r3
,
r3
,
#
0x1C
beq
congruent_aligned32
cmp
r3
,
r2
it
hi
andhi
r3
,
r2
,
#
0x1C
/
*
conditionnaly
copies
0
to
7
words
(
length
in
r3
)
*/
movs
r12
,
r3
,
lsl
#
28
itt
cs
ldmcs
r1
!,
{
r4
,
r5
,
r6
,
r7
}
/*
16
bytes
*/
stmcs
r0
!,
{
r4
,
r5
,
r6
,
r7
}
itt
mi
ldmmi
r1
!,
{
r8
,
r9
}
/*
8
bytes
*/
stmmi
r0
!,
{
r8
,
r9
}
tst
r3
,
#
0x4
itt
ne
ldrne
r10
,[
r1
],
#
4
/*
4
bytes
*/
strne
r10
,[
r0
],
#
4
sub
r2
,
r2
,
r3
congruent_aligned32
:
/
*
*
here
source
is
aligned
to
32
bytes
.
*/
cached_aligned32
:
subs
r2
,
r2
,
#
32
blo
less_than_32_left
/
*
*
We
preload
a
cache
-
line
up
to
64
bytes
ahead
.
On
the
926
,
this
will
*
stall
only
until
the
requested
world
is
fetched
,
but
the
linefill
*
continues
in
the
the
background
.
*
While
the
linefill
is
going
,
we
write
our
previous
cache
-
line
*
into
the
write
-
buffer
(
which
should
have
some
free
space
)
.
*
When
the
linefill
is
done
,
the
writebuffer
will
*
start
dumping
its
content
into
memory
*
*
While
all
this
is
going
,
we
then
load
a
full
cache
line
into
*
8
registers
,
this
cache
line
should
be
in
the
cache
by
now
*
(
or
partly
in
the
cache
)
.
*
*
This
code
should
work
well
regardless
of
the
source
/
dest
alignment
.
*
*/
/
*
Align
the
preload
register
to
a
cache
-
line
because
the
cpu
does
*
"critical word first"
(
the
first
word
requested
is
loaded
first
)
.
*/
@
bic
r12
,
r1
,
#
0x1F
@
add
r12
,
r12
,
#
64
1
:
ldmia
r1
!,
{
r4
-
r11
}
subs
r2
,
r2
,
#
32
/
*
*
NOTE
:
if
r12
is
more
than
64
ahead
of
r1
,
the
following
ldrhi
*
for
ARM9
preload
will
not
be
safely
guarded
by
the
preceding
subs
.
*
When
it
is
safely
guarded
the
only
possibility
to
have
SIGSEGV
here
*
is
because
the
caller
overstates
the
length
.
*/
@
ldrhi
r3
,
[
r12
],
#
32
/*
cheap
ARM9
preload
*/
stmia
r0
!,
{
r4
-
r11
}
bhs
1
b
add
r2
,
r2
,
#
32
less_than_32_left
:
/
*
*
less
than
32
bytes
left
at
this
point
(
length
in
r2
)
*/
/
*
skip
all
this
if
there
is
nothing
to
do
,
which
should
*
be
a
common
case
(
if
not
executed
the
code
below
takes
*
about
16
cycles
)
*/
tst
r2
,
#
0x1F
beq
1
f
/
*
conditionnaly
copies
0
to
31
bytes
*/
movs
r12
,
r2
,
lsl
#
28
itt
cs
ldmcs
r1
!,
{
r4
,
r5
,
r6
,
r7
}
/*
16
bytes
*/
stmcs
r0
!,
{
r4
,
r5
,
r6
,
r7
}
itt
mi
ldmmi
r1
!,
{
r8
,
r9
}
/*
8
bytes
*/
stmmi
r0
!,
{
r8
,
r9
}
movs
r12
,
r2
,
lsl
#
30
itt
cs
ldrcs
r3
,
[
r1
],
#
4
/*
4
bytes
*/
strcs
r3
,
[
r0
],
#
4
itt
mi
ldrhmi
r4
,
[
r1
],
#
2
/*
2
bytes
*/
strhmi
r4
,
[
r0
],
#
2
tst
r2
,
#
0x1
itt
ne
ldrbne
r3
,
[
r1
]
/*
last
byte
*/
strbne
r3
,
[
r0
]
/
*
we
're done! restore everything and return */
1
:
ldmfd
sp
!,
{
r5
-
r11
}
ldmfd
sp
!,
{
r0
,
r4
,
lr
}
bx
lr
/********************************************************************/
non_congruent
:
/
*
*
here
source
is
aligned
to
4
bytes
*
but
destination
is
not
.
*
*
in
the
code
below
r2
is
the
number
of
bytes
read
*
(
the
number
of
bytes
written
is
always
smaller
,
because
we
have
*
partial
words
in
the
shift
queue
)
*/
cmp
r2
,
#
4
blo
copy_last_3_and_return
/
*
Use
post
-
incriment
mode
for
stm
to
spill
r5
-
r11
to
reserved
stack
*
frame
.
Don
't update sp.
*/
stmea
sp
,
{
r5
-
r11
}
/
*
compute
shifts
needed
to
align
src
to
dest
*/
rsb
r5
,
r0
,
#
0
and
r5
,
r5
,
#
3
/*
r5
=
#
bytes
in
partial
words
*/
mov
r12
,
r5
,
lsl
#
3
/*
r12
=
right
*/
rsb
lr
,
r12
,
#
32
/*
lr
=
left
*/
/
*
read
the
first
word
*/
ldr
r3
,
[
r1
],
#
4
sub
r2
,
r2
,
#
4
/
*
write
a
partial
word
(
0
to
3
bytes
),
such
that
destination
*
becomes
aligned
to
32
bits
(
r5
=
nb
of
words
to
copy
for
alignment
)
*/
movs
r5
,
r5
,
lsl
#
31
itt
mi
strbmi
r3
,
[
r0
],
#
1
movmi
r3
,
r3
,
lsr
#
8
itttt
cs
strbcs
r3
,
[
r0
],
#
1
movcs
r3
,
r3
,
lsr
#
8
strbcs
r3
,
[
r0
],
#
1
movcs
r3
,
r3
,
lsr
#
8
cmp
r2
,
#
4
blo
partial_word_tail
/
*
Align
destination
to
32
bytes
(
cache
line
boundary
)
*/
1
:
tst
r0
,
#
0x1c
beq
2
f
ldr
r5
,
[
r1
],
#
4
sub
r2
,
r2
,
#
4
mov
r4
,
r5
,
lsl
lr
orr
r4
,
r4
,
r3
mov
r3
,
r5
,
lsr
r12
str
r4
,
[
r0
],
#
4
cmp
r2
,
#
4
bhs
1
b
blo
partial_word_tail
/
*
copy
32
bytes
at
a
time
*/
2
:
subs
r2
,
r2
,
#
32
blo
less_than_thirtytwo
/
*
Use
immediate
mode
for
the
shifts
,
because
there
is
an
extra
cycle
*
for
register
shifts
,
which
could
account
for
up
to
50
%
of
*
performance
hit
.
*/
cmp
r12
,
#
24
beq
loop24
cmp
r12
,
#
8
beq
loop8
loop16
:
ldr
r12
,
[
r1
],
#
4
1
:
mov
r4
,
r12
ldmia
r1
!,
{
r5
,
r6
,
r7
,
r8
,
r9
,
r10
,
r11
}
subs
r2
,
r2
,
#
32
it
hs
ldrhs
r12
,
[
r1
],
#
4
orr
r3
,
r3
,
r4
,
lsl
#
16
mov
r4
,
r4
,
lsr
#
16
orr
r4
,
r4
,
r5
,
lsl
#
16
mov
r5
,
r5
,
lsr
#
16
orr
r5
,
r5
,
r6
,
lsl
#
16
mov
r6
,
r6
,
lsr
#
16
orr
r6
,
r6
,
r7
,
lsl
#
16
mov
r7
,
r7
,
lsr
#
16
orr
r7
,
r7
,
r8
,
lsl
#
16
mov
r8
,
r8
,
lsr
#
16
orr
r8
,
r8
,
r9
,
lsl
#
16
mov
r9
,
r9
,
lsr
#
16
orr
r9
,
r9
,
r10
,
lsl
#
16
mov
r10
,
r10
,
lsr
#
16
orr
r10
,
r10
,
r11
,
lsl
#
16
stmia
r0
!,
{
r3
,
r4
,
r5
,
r6
,
r7
,
r8
,
r9
,
r10
}
mov
r3
,
r11
,
lsr
#
16
bhs
1
b
b
less_than_thirtytwo
loop8
:
ldr
r12
,
[
r1
],
#
4
1
:
mov
r4
,
r12
ldmia
r1
!,
{
r5
,
r6
,
r7
,
r8
,
r9
,
r10
,
r11
}
subs
r2
,
r2
,
#
32
it
hs
ldrhs
r12
,
[
r1
],
#
4
orr
r3
,
r3
,
r4
,
lsl
#
24
mov
r4
,
r4
,
lsr
#
8
orr
r4
,
r4
,
r5
,
lsl
#
24
mov
r5
,
r5
,
lsr
#
8
orr
r5
,
r5
,
r6
,
lsl
#
24
mov
r6
,
r6
,
lsr
#
8
orr
r6
,
r6
,
r7
,
lsl
#
24
mov
r7
,
r7
,
lsr
#
8
orr
r7
,
r7
,
r8
,
lsl
#
24
mov
r8
,
r8
,
lsr
#
8
orr
r8
,
r8
,
r9
,
lsl
#
24
mov
r9
,
r9
,
lsr
#
8
orr
r9
,
r9
,
r10
,
lsl
#
24
mov
r10
,
r10
,
lsr
#
8
orr
r10
,
r10
,
r11
,
lsl
#
24
stmia
r0
!,
{
r3
,
r4
,
r5
,
r6
,
r7
,
r8
,
r9
,
r10
}
mov
r3
,
r11
,
lsr
#
8
bhs
1
b
b
less_than_thirtytwo
loop24
:
ldr
r12
,
[
r1
],
#
4
1
:
mov
r4
,
r12
ldmia
r1
!,
{
r5
,
r6
,
r7
,
r8
,
r9
,
r10
,
r11
}
subs
r2
,
r2
,
#
32
it
hs
ldrhs
r12
,
[
r1
],
#
4
orr
r3
,
r3
,
r4
,
lsl
#
8
mov
r4
,
r4
,
lsr
#
24
orr
r4
,
r4
,
r5
,
lsl
#
8
mov
r5
,
r5
,
lsr
#
24
orr
r5
,
r5
,
r6
,
lsl
#
8
mov
r6
,
r6
,
lsr
#
24
orr
r6
,
r6
,
r7
,
lsl
#
8
mov
r7
,
r7
,
lsr
#
24
orr
r7
,
r7
,
r8
,
lsl
#
8
mov
r8
,
r8
,
lsr
#
24
orr
r8
,
r8
,
r9
,
lsl
#
8
mov
r9
,
r9
,
lsr
#
24
orr
r9
,
r9
,
r10
,
lsl
#
8
mov
r10
,
r10
,
lsr
#
24
orr
r10
,
r10
,
r11
,
lsl
#
8
stmia
r0
!,
{
r3
,
r4
,
r5
,
r6
,
r7
,
r8
,
r9
,
r10
}
mov
r3
,
r11
,
lsr
#
24
bhs
1
b
less_than_thirtytwo
:
/
*
copy
the
last
0
to
31
bytes
of
the
source
*/
rsb
r12
,
lr
,
#
32
/*
we
corrupted
r12
,
recompute
it
*/
add
r2
,
r2
,
#
32
cmp
r2
,
#
4
blo
partial_word_tail
1
:
ldr
r5
,
[
r1
],
#
4
sub
r2
,
r2
,
#
4
mov
r4
,
r5
,
lsl
lr
orr
r4
,
r4
,
r3
mov
r3
,
r5
,
lsr
r12
str
r4
,
[
r0
],
#
4
cmp
r2
,
#
4
bhs
1
b
partial_word_tail
:
/
*
we
have
a
partial
word
in
the
input
buffer
*/
movs
r5
,
lr
,
lsl
#(
31
-
3
)
itt
mi
strbmi
r3
,
[
r0
],
#
1
movmi
r3
,
r3
,
lsr
#
8
ittt
cs
strbcs
r3
,
[
r0
],
#
1
movcs
r3
,
r3
,
lsr
#
8
strbcs
r3
,
[
r0
],
#
1
/
*
Refill
spilled
registers
from
the
stack
.
Don
't update sp. */
ldmfd
sp
,
{
r5
-
r11
}
copy_last_3_and_return
:
movs
r2
,
r2
,
lsl
#
31
/*
copy
remaining
0
,
1
,
2
or
3
bytes
*/
itt
mi
ldrbmi
r2
,
[
r1
],
#
1
strbmi
r2
,
[
r0
],
#
1
itttt
cs
ldrbcs
r3
,
[
r1
],
#
1
ldrbcs
r12
,[
r1
]
strbcs
r3
,
[
r0
],
#
1
strbcs
r12
,[
r0
]
/
*
we
're done! restore sp and spilled registers and return */
add
sp
,
sp
,
#
28
ldmfd
sp
!,
{
r0
,
r4
,
lr
}
bx
lr
#endif
porting/liteos_m/kernel/src/string/arch/arm/memset_armv8m.S
浏览文件 @
af0d3bda
...
...
@@ -39,7 +39,7 @@
x
:
#if defined(LOSCFG_KERNEL_LMS)
FUNCTION
(
_memset
)
FUNCTION
(
_
_
memset
)
#else
FUNCTION
(
memset
)
#endif
...
...
porting/liteos_m/kernel/src/string/memcpy.c
浏览文件 @
af0d3bda
#if __ARMEB__
#include <string.h>
#include <stdint.h>
#include <endian.h>
...
...
@@ -126,3 +127,4 @@ void *memcpy(void *restrict dest, const void *restrict src, size_t n)
for
(;
n
;
n
--
)
*
d
++
=
*
s
++
;
return
dest
;
}
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录