硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4837|回复: 5
收起左侧

[STM32H7] 推荐个汇编版memcpy

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107549
QQ
发表于 2021-4-23 09:21:55 | 显示全部楼层 |阅读模式


来自Micrium

lib_mem_a.asm (11.03 KB, 下载次数: 9)

  1. ;********************************************************************************************************
  2. ;                                               uC/LIB
  3. ;                                       Custom Library Modules
  4. ;
  5. ;                    Copyright 2004-2020 Silicon Laboratories Inc. www.silabs.com
  6. ;
  7. ;                                 SPDX-License-Identifier: APACHE-2.0
  8. ;
  9. ;               This software is subject to an open source license and is distributed by
  10. ;                Silicon Laboratories Inc. pursuant to the terms of the Apache License,
  11. ;                    Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
  12. ;
  13. ;********************************************************************************************************


  14. ;********************************************************************************************************
  15. ;
  16. ;                                     STANDARD MEMORY OPERATIONS
  17. ;
  18. ;                                           ARM-Cortex-M4
  19. ;                                     RealView Development Suite
  20. ;                            RealView Microcontroller Development Kit (MDK)
  21. ;                                      ARM Developer Suite (ADS)
  22. ;                                           Keil uVision
  23. ;
  24. ; Filename : lib_mem_a.asm
  25. ; Version  : V1.39.00
  26. ;********************************************************************************************************
  27. ; Note(s)  : (1) NO compiler-supplied standard library functions are used in library or product software.
  28. ;
  29. ;                (a) ALL standard library functions are implemented in the custom library modules :
  30. ;
  31. ;                    (1) \<Custom Library Directory>\lib*.*
  32. ;
  33. ;                    (2) \<Custom Library Directory>\Ports\<cpu>\<compiler>\lib*_a.*
  34. ;
  35. ;                          where
  36. ;                                  <Custom Library Directory>      directory path for custom library software
  37. ;                                  <cpu>                           directory name for specific processor (CPU)
  38. ;                                  <compiler>                      directory name for specific compiler
  39. ;
  40. ;                (b) Product-specific library functions are implemented in individual products.
  41. ;
  42. ;            (2) Assumes ARM CPU mode configured for Little Endian.
  43. ;********************************************************************************************************


  44. ;********************************************************************************************************
  45. ;                                           PUBLIC FUNCTIONS
  46. ;********************************************************************************************************

  47.         EXPORT  Mem_Copy


  48. ;********************************************************************************************************
  49. ;                                      CODE GENERATION DIRECTIVES
  50. ;********************************************************************************************************

  51.         AREA |.text|, CODE, READONLY, ALIGN=2
  52.         THUMB
  53.         REQUIRE8
  54.         PRESERVE8


  55. ;********************************************************************************************************
  56. ;                                             Mem_Copy()
  57. ;
  58. ; Description : Copy data octets from one buffer to another buffer.
  59. ;
  60. ; Argument(s) : pdest       Pointer to destination memory buffer.
  61. ;
  62. ;               psrc        Pointer to source      memory buffer.
  63. ;
  64. ;               size        Number of data buffer octets to copy.
  65. ;
  66. ; Return(s)   : none.
  67. ;
  68. ; Caller(s)   : Application.
  69. ;
  70. ; Note(s)     : (1) Null copies allowed (i.e. 0-octet size).
  71. ;
  72. ;               (2) Memory buffers NOT checked for overlapping.
  73. ;
  74. ;               (3) Modulo arithmetic is used to determine whether a memory buffer starts on a 'CPU_ALIGN'
  75. ;                   address boundary.
  76. ;
  77. ;               (4) ARM Cortex-M3 processors use a subset of the ARM Thumb-2 instruction set which does
  78. ;                   NOT support 16-bit conditional branch instructions but ONLY supports 8-bit conditional
  79. ;                   branch instructions.
  80. ;
  81. ;                   Therefore, branches exceeding 8-bit, signed, relative offsets :
  82. ;
  83. ;                   (a) CANNOT be implemented with     conditional branches; but ...
  84. ;                   (b) MUST   be implemented with non-conditional branches.
  85. ;********************************************************************************************************

  86. ; void  Mem_Copy (void        *pdest,       ;  ==>  R0
  87. ;                 void        *psrc,        ;  ==>  R1
  88. ;                 CPU_SIZE_T   size)        ;  ==>  R2

  89. Mem_Copy
  90.         CMP         R0, #0
  91.         BNE         Mem_Copy_1
  92.         BX          LR                      ; return if pdest == NULL

  93. Mem_Copy_1
  94.         CMP         R1, #0
  95.         BNE         Mem_Copy_2
  96.         BX          LR                      ; return if psrc  == NULL

  97. Mem_Copy_2
  98.         CMP         R2, #0
  99.         BNE         Mem_Copy_3
  100.         BX          LR                      ; return if size  == 0

  101. Mem_Copy_3
  102.         STMFD       SP!, {R3-R12}           ; save registers on stack


  103. Chk_Align_32                                ; check if both dest & src 32-bit aligned
  104.         AND         R3, R0, #0x03
  105.         AND         R4, R1, #0x03
  106.         CMP         R3, R4
  107.         BNE         Chk_Align_16            ; not 32-bit aligned, check for 16-bit alignment

  108.         RSB         R3, R3, #0x04           ; compute 1-2-3 pre-copy bytes (to align to the next 32-bit boundary)
  109.         AND         R3, R3, #0x03

  110. Pre_Copy_1
  111.         CMP         R3, #1                  ; copy 1-2-3 bytes (to align to the next 32-bit boundary)
  112.         BCC         Copy_32_1               ; start real 32-bit copy
  113.         CMP         R2, #1                  ; check if any more data to copy
  114.         BCS         Pre_Copy_1_Cont
  115.         B           Mem_Copy_END            ;           no more data to copy (see Note #4b)

  116. Pre_Copy_1_Cont
  117.         LDRB        R4, [R1], #1
  118.         STRB        R4, [R0], #1
  119.         SUB         R3, R3, #1
  120.         SUB         R2, R2, #1
  121.         B           Pre_Copy_1


  122. Chk_Align_16                                ; check if both dest & src 16-bit aligned
  123.         AND         R3, R0, #0x01
  124.         AND         R4, R1, #0x01
  125.         CMP         R3, R4
  126.         BEQ         Pre_Copy_2
  127.         B           Copy_08_1               ; not 16-bit aligned, start 8-bit copy (see Note #4b)

  128. Pre_Copy_2
  129.         CMP         R3, #1                  ; copy 1 byte (to align to the next 16-bit boundary)
  130.         BCC         Copy_16_1               ; start real 16-bit copy

  131.         LDRB        R4, [R1], #1
  132.         STRB        R4, [R0], #1
  133.         SUB         R3, R3, #1
  134.         SUB         R2, R2, #1
  135.         B           Pre_Copy_2


  136. Copy_32_1
  137.         CMP         R2, #(04*10*09)         ; Copy 9 chunks of 10 32-bit words (360 octets per loop)
  138.         BCC         Copy_32_2
  139.         LDMIA       R1!, {R3-R12}
  140.         STMIA       R0!, {R3-R12}
  141.         LDMIA       R1!, {R3-R12}
  142.         STMIA       R0!, {R3-R12}
  143.         LDMIA       R1!, {R3-R12}
  144.         STMIA       R0!, {R3-R12}
  145.         LDMIA       R1!, {R3-R12}
  146.         STMIA       R0!, {R3-R12}
  147.         LDMIA       R1!, {R3-R12}
  148.         STMIA       R0!, {R3-R12}
  149.         LDMIA       R1!, {R3-R12}
  150.         STMIA       R0!, {R3-R12}
  151.         LDMIA       R1!, {R3-R12}
  152.         STMIA       R0!, {R3-R12}
  153.         LDMIA       R1!, {R3-R12}
  154.         STMIA       R0!, {R3-R12}
  155.         LDMIA       R1!, {R3-R12}
  156.         STMIA       R0!, {R3-R12}
  157.         SUB         R2, R2, #(04*10*09)
  158.         B           Copy_32_1

  159. Copy_32_2
  160.         CMP         R2, #(04*10*01)         ; Copy chunks of 10 32-bit words (40 octets per loop)
  161.         BCC         Copy_32_3
  162.         LDMIA       R1!, {R3-R12}
  163.         STMIA       R0!, {R3-R12}
  164.         SUB         R2, R2, #(04*10*01)
  165.         B           Copy_32_2

  166. Copy_32_3
  167.         CMP         R2, #(04*01*01)         ; Copy remaining 32-bit words
  168.         BCC         Copy_16_1
  169.         LDR         R3, [R1], #4
  170.         STR         R3, [R0], #4
  171.         SUB         R2, R2, #(04*01*01)
  172.         B           Copy_32_3

  173. Copy_16_1
  174.         CMP         R2, #(02*01*16)         ; Copy chunks of 16 16-bit words (32 bytes per loop)
  175.         BCC         Copy_16_2
  176.         LDRH        R3, [R1], #2
  177.         STRH        R3, [R0], #2
  178.         LDRH        R3, [R1], #2
  179.         STRH        R3, [R0], #2
  180.         LDRH        R3, [R1], #2
  181.         STRH        R3, [R0], #2
  182.         LDRH        R3, [R1], #2
  183.         STRH        R3, [R0], #2
  184.         LDRH        R3, [R1], #2
  185.         STRH        R3, [R0], #2
  186.         LDRH        R3, [R1], #2
  187.         STRH        R3, [R0], #2
  188.         LDRH        R3, [R1], #2
  189.         STRH        R3, [R0], #2
  190.         LDRH        R3, [R1], #2
  191.         STRH        R3, [R0], #2
  192.         LDRH        R3, [R1], #2
  193.         STRH        R3, [R0], #2
  194.         LDRH        R3, [R1], #2
  195.         STRH        R3, [R0], #2
  196.         LDRH        R3, [R1], #2
  197.         STRH        R3, [R0], #2
  198.         LDRH        R3, [R1], #2
  199.         STRH        R3, [R0], #2
  200.         LDRH        R3, [R1], #2
  201.         STRH        R3, [R0], #2
  202.         LDRH        R3, [R1], #2
  203.         STRH        R3, [R0], #2
  204.         LDRH        R3, [R1], #2
  205.         STRH        R3, [R0], #2
  206.         LDRH        R3, [R1], #2
  207.         STRH        R3, [R0], #2
  208.         SUB         R2, R2, #(02*01*16)
  209.         B           Copy_16_1

  210. Copy_16_2
  211.         CMP         R2, #(02*01*01)         ; Copy remaining 16-bit words
  212.         BCC         Copy_08_1
  213.         LDRH        R3, [R1], #2
  214.         STRH        R3, [R0], #2
  215.         SUB         R2, R2, #(02*01*01)
  216.         B           Copy_16_2

  217. Copy_08_1
  218.         CMP         R2, #(01*01*16)         ; Copy chunks of 16 8-bit words (16 bytes per loop)
  219.         BCC         Copy_08_2
  220.         LDRB        R3, [R1], #1
  221.         STRB        R3, [R0], #1
  222.         LDRB        R3, [R1], #1
  223.         STRB        R3, [R0], #1
  224.         LDRB        R3, [R1], #1
  225.         STRB        R3, [R0], #1
  226.         LDRB        R3, [R1], #1
  227.         STRB        R3, [R0], #1
  228.         LDRB        R3, [R1], #1
  229.         STRB        R3, [R0], #1
  230.         LDRB        R3, [R1], #1
  231.         STRB        R3, [R0], #1
  232.         LDRB        R3, [R1], #1
  233.         STRB        R3, [R0], #1
  234.         LDRB        R3, [R1], #1
  235.         STRB        R3, [R0], #1
  236.         LDRB        R3, [R1], #1
  237.         STRB        R3, [R0], #1
  238.         LDRB        R3, [R1], #1
  239.         STRB        R3, [R0], #1
  240.         LDRB        R3, [R1], #1
  241.         STRB        R3, [R0], #1
  242.         LDRB        R3, [R1], #1
  243.         STRB        R3, [R0], #1
  244.         LDRB        R3, [R1], #1
  245.         STRB        R3, [R0], #1
  246.         LDRB        R3, [R1], #1
  247.         STRB        R3, [R0], #1
  248.         LDRB        R3, [R1], #1
  249.         STRB        R3, [R0], #1
  250.         LDRB        R3, [R1], #1
  251.         STRB        R3, [R0], #1
  252.         SUB         R2, R2, #(01*01*16)
  253.         B           Copy_08_1

  254. Copy_08_2
  255.         CMP         R2, #(01*01*01)         ; Copy remaining 8-bit words
  256.         BCC         Mem_Copy_END
  257.         LDRB        R3, [R1], #1
  258.         STRB        R3, [R0], #1
  259.         SUB         R2, R2, #(01*01*01)
  260.         B           Copy_08_2


  261. Mem_Copy_END
  262.         LDMFD       SP!, {R3-R12}           ; restore registers from stack
  263.         BX          LR                      ; return


  264.         END

复制代码


回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2021-4-23 17:29:14 | 显示全部楼层
本帖最后由 王海靖 于 2021-4-24 14:46 编辑

那我也推荐一下

https://github.com/mysterywolf/rt_memcpy_cm

有个热心的网友已经把这个无缝衔接到 RT-Thread 了
忘记贴网址了,再编辑一下。

楼下好奇的对比这里有说明,我直接搬运过来就好了。

keil环境下 10000个字节复制一万次
rt_memcpy为1261ms
本汇编版本为883ms
C库memcpy为906ms

回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
发表于 2021-4-23 21:59:25 | 显示全部楼层
有没有测过与C库函数之间的执行速度对比
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107549
QQ
 楼主| 发表于 2021-4-24 10:10:26 | 显示全部楼层
gnail092 发表于 2021-4-23 21:59
有没有测过与C库函数之间的执行速度对比

还没有测,准备测试比较下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107549
QQ
 楼主| 发表于 2021-4-25 09:13:57 | 显示全部楼层
王海靖 发表于 2021-4-23 17:29
那我也推荐一下

https://github.com/mysterywolf/rt_memcpy_cm

谢谢,相比C库优势不明显,有没有在各种IDE,各种最高等级优化下的测试数据
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2021-4-25 09:42:23 | 显示全部楼层
eric2013 发表于 2021-4-25 09:13
谢谢,相比C库优势不明显,有没有在各种IDE,各种最高等级优化下的测试数据

暂时还没有
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-5 13:38 , Processed in 0.248106 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表