⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memcopy.s

📁 STR912 arm9实现的以太网通信程序
💻 S
字号:
;/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
; File Name          : memcopy.s
; Author             : MCD Application Team
; Version            : V2.0
; Date               : 12/07/2007
; Description        : This file contains optimized memcopy functions
;********************************************************************************
; THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
; CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
;******************************************************************************/


        AREA    CODE, CODE, READONLY	
        CODE32

        EXPORT  MEMCOPY_L2S_BY4
        EXPORT  MEMCOPY_S2L_BY4
        EXPORT  MEMCOPY_L2L_BY4



; void  MEMCOPY_L2S_BY4 (void *pBUFOUT, void *pBUFIN, long nBytes)
;  Copy N bytes from a 32-bit aligned buffer to a 16-bit aligned buffer.
; Resources:
;  R0,R1,R2: parameters
;  R3-R10: locals
; Notes:
; - N Minimum is 16 bytes
; - pointer source and dest cannot be exactly the same; but an offset of -4 between dst and source will work
;/////////////////////////////////////////////////////////////////////////// */

MEMCOPY_L2S_BY4
        STMFD       SP!, {R4-R10}
        B                 d_begin
d_main
        LDMIA       R1!,{R3,R5,R7,R9}
        MOV         R4, R3, LSR #16
        MOV         R6, R5, LSR #16
        MOV         R8, R7, LSR #16
        MOV         R10, R9, LSR #16
        STRH        R3, [R0], #2
        STRH        R4, [R0], #2
        STRH        R5, [R0], #2
        STRH        R6, [R0], #2
        STRH        R7, [R0], #2
        STRH        R8, [R0], #2
        STRH        R9, [R0], #2
        STRH        R10, [R0], #2
        SUB         R2, R2, #16
d_begin        
        CMP         R2,#16            ;if ( remaining_bytes >= 16)
        BHS         d_main            ;keep on looping
                                      ;else switch(remaining_bytes) d_swit d_0123
        CMP         R2,#3             ;remaining <= 3 bytes?
        BLS         d_switch

d_4567

        LDR         R3, [R1], #4
        MOV         R4, R3, LSR #16
        STRH        R3, [R0], #2
        STRH        R4, [R0], #2
        SUB         R2, R2, #4
        CMP         R2,#3           ; remaining <= 3 bytes?
        BLS         d_switch        ;    switch(remaining_bytes 0,1,2,3)

d_891011

        LDR         R3, [R1], #4
        MOV         R4, R3, LSR #16
        STRH        R3, [R0], #2
        STRH        R4, [R0], #2
        SUB         R2, R2, #4
        CMP         R2,#3         ; remaining <= 3 bytes?
        BLS         d_switch      ;    switch(remaining_bytes 0,1,2,3)

d_12131415

        LDR         R3, [R1], #4
        MOV         R4, R3, LSR #16
        STRH        R3, [R0], #2
        STRH        R4, [R0], #2
        SUB         R2, R2, #4

d_switch

       LDR PC,[PC, R2, LSL#2]
       B       d_END
       DCD    d_END
       DCD    d_1B
       DCD    d_2B
       DCD    d_3B

d_1B

        LDRB        R3, [R1]
        STRB        R3, [R0]
        B           d_END

d_2B

        LDRH        R3, [R1]
        STRH        R3, [R0]
        B           d_END

d_3B
        LDRH        R3, [R1], #2
        LDRB        R4, [R1]
        STRH        R3, [R0], #2
        STRB        R4, [R0]

d_END

        LDMFD       SP!, {R4-R10}
        BX          LR


; void  MEMCOPY_L2L_BY4 (void *pBUFOUT, void *pBUFIN, long nBytes)
;  Copy N bytes from a 32-bit aligned buffer to a 32-bit aligned buffer.
; Resources:
;  R0,R1,R2: parameters
;  R3-R10: locals
; Notes:
; - N Minimum is 16 bytes
; - pointer source and dest cannot be exactly the same; but an offset of -4 between dst and source will work

MEMCOPY_L2L_BY4
        STMFD       SP!, {R4-R10}

e_main
        LDMIA       R1!,{R3,R5,R7,R9}
        STMIA       R0!,{R3,R5,R7,R9}
        SUB         R2, R2, #16
        CMP         R2,#16          ; if ( remaining_bytes >= 16)
        BHS         e_main          ; keep on looping
                                    ; else switch(remaining_bytes)
e_swit
e_0123
        CMP         R2,#3           ; remaining <= 3 bytes?
        BLS         e_switch
e_4567

        LDR         R3, [R1], #4
        STR         R3, [R0], #4
        SUB         R2, R2, #4
        CMP         R2,#3             ; remaining <= 3 bytes?
        BLS         e_switch          ; switch(remaining_bytes 0,1,2,3)
e_891011
        LDR         R3, [R1], #4
        STR         R3, [R0], #4
        SUB         R2, R2, #4
        CMP         R2,#3              ; remaining <= 3 bytes?
        BLS         e_switch           ;    switch(remaining_bytes 0,1,2,3)
e_12131415
        LDR         R3, [R1], #4
        STR         R3, [R0], #4
        SUB         R2, R2, #4

e_switch
        LDR PC,[PC, R2, LSL#2]
        B e_END
       DCW   e_END
       DCW   e_1B
       DCW   e_2B
       DCW   e_3B

e_1B
        LDRB        R3, [R1]
        STRB        R3, [R0]
        B           e_END
e_2B
        LDRH        R3, [R1]
        STRH        R3, [R0]
        B           e_END
e_3B
        LDRH        R3, [R1], #2
        LDRB        R4, [R1]
        STRH        R3, [R0], #2
        STRB        R4, [R0]
        B           e_END
e_END
        LDMFD       SP!, {R4-R10}
        BX LR

; void  MEMCOPY_S2L_BY4 (void *pBUFOUT, void *pBUFIN, long nBytes)
;  Copy N bytes from a 32-bit aligned buffer to a 16-bit aligned buffer.
; Resources:
;  R0,R1,R2: parameters
;  R3-R10: locals
; Notes:
; - N Minimum is 16 bytes
; - pointer source and dest cannot be exactly the same; but an offset of -4 between dst and source will work

MEMCOPY_S2L_BY4
        STMFD       SP!, {R4-R10}

f_main
        LDRH        R3, [R1], #2
        LDRH        R4, [R1], #2
        LDRH        R5, [R1], #2
        LDRH        R6, [R1], #2
        LDRH        R7, [R1], #2
        LDRH        R8, [R1], #2
        LDRH        R9, [R1], #2
        LDRH        R10, [R1], #2
        ORR         R3,R3,R4,  LSL#16
        ORR         R5,R5,R6,  LSL#16
        ORR         R7,R7,R8,  LSL#16
        ORR         R9,R9,R10, LSL#16
        STMIA       R0!,{R3,R5,R7,R9}
        SUB         R2, R2, #16
        CMP         R2,#16      ; if ( remaining_bytes >= 16)
        BHS         f_main      ; keep on looping
                                ; else switch(remaining_bytes)
f_swit
f_0123
        CMP         R2,#3        ; remaining <= 3 bytes?
        BLS         f_switch
f_4567
        LDRH        R3, [R1], #2
        LDRH        R4, [R1], #2
        ORR         R3,R3,R4, LSL#16
        STR         R3, [R0], #4
        SUB         R2, R2, #4
        CMP         R2,#3        ; remaining <= 3 bytes?
        BLS         f_switch     ;    switch(remaining_bytes 0,1,2,3)
f_891011
        LDRH        R3, [R1], #2
        LDRH        R4, [R1], #2
        ORR         R3,R3,R4, LSL#16
        STR         R3, [R0], #4
        SUB         R2, R2, #4
        CMP         R2,#3         ; remaining <= 3 bytes?
        BLS         f_switch      ;    switch(remaining_bytes 0,1,2,3)
f_12131415
        LDRH        R3, [R1], #2
        LDRH        R4, [R1], #2
        ORR         R3,R3,R4, LSL#16
        STR         R3, [R0], #4
        SUB         R2, R2, #4

f_switch
        LDR PC,[PC, R2, LSL#2]
        B f_END
       DCW   f_END
       DCW   f_1B
       DCW   f_2B
       DCW   f_3B

f_1B
        LDRB        R3, [R1]
        STRB        R3, [R0]
        B           f_END
f_2B
        LDRH        R3, [R1]
        STRH        R3, [R0]
        B           f_END
f_3B
        LDRH        R3, [R1], #2
        LDRB        R4, [R1]
        STRH        R3, [R0], #2
        STRB        R4, [R0]
        B           f_END
f_END
        LDMFD       SP!, {R4-R10}
        BX LR

         END



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -