• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#------------------------------------------------------------------------------
2#
3# CopyMem() worker for ARM
4#
5# This file started out as C code that did 64 bit moves if the buffer was
6# 32-bit aligned, else it does a byte copy. It also does a byte copy for
7# any trailing bytes. Update using VSTM/SLDM to do 128 byte copies.
8#
9# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
10# This program and the accompanying materials
11# are licensed and made available under the terms and conditions of the BSD License
12# which accompanies this distribution.  The full text of the license may be found at
13# http://opensource.org/licenses/bsd-license.php
14#
15# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
16# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17#
18#------------------------------------------------------------------------------
19
20/**
21  Copy Length bytes from Source to Destination. Overlap is OK.
22
23  This implementation
24
25  @param  Destination Target of copy
26  @param  Source      Place to copy from
27  @param  Length      Number of bytes to copy
28
29  @return Destination
30
31
32VOID *
33EFIAPI
34InternalMemCopyMem (
35  OUT     VOID                      *DestinationBuffer,
36  IN      CONST VOID                *SourceBuffer,
37  IN      UINTN                     Length
38  )
39**/
40.text
41.align 2
42GCC_ASM_EXPORT(InternalMemCopyMem)
43
44ASM_PFX(InternalMemCopyMem):
45  stmfd  sp!, {r4, r9, lr}
46  tst  r0, #3
47  mov  r4, r0
48  mov  r9, r0
49  mov  ip, r2
50  mov  lr, r1
51  movne  r0, #0
52  bne  L4
53  tst  r1, #3
54  movne  r3, #0
55  moveq  r3, #1
56  cmp  r2, #127
57  movls  r0, #0
58  andhi  r0, r3, #1
59L4:
60  cmp  r4, r1
61  bcc  L26
62  bls  L7
63  rsb  r3, r1, r4
64  cmp  ip, r3
65  bcc  L26
66  cmp  ip, #0
67  beq  L7
68  add  r9, r4, ip
69  add  lr, ip, r1
70  b  L16
71L29:
72  sub  ip, ip, #8
73  cmp  ip, #7
74  ldrd  r2, [lr, #-8]!
75  movls  r0, #0
76  cmp  ip, #0
77  strd  r2, [r9, #-8]!
78  beq  L7
79L16:
80  cmp  r0, #0
81  bne  L29
82  sub  r3, lr, #1
83  sub  ip, ip, #1
84  ldrb  r3, [r3, #0]
85  sub  r2, r9, #1
86  cmp  ip, #0
87  sub  r9, r9, #1
88  sub  lr, lr, #1
89  strb  r3, [r2, #0]
90  bne  L16
91  b   L7
92L11:
93  ldrb  r3, [lr], #1
94  sub  ip, ip, #1
95  strb  r3, [r9], #1
96L26:
97  cmp  ip, #0
98  beq  L7
99L30:
100  cmp  r0, #0
101  beq  L11
102  sub  ip, ip, #128          // 32
103  cmp  ip, #127              // 31
104  vldm     lr!, {d0-d15}
105  movls  r0, #0
106  cmp  ip, #0
107  vstm  r9!, {d0-d15}
108  bne  L30
109L7:
110  dsb
111  mov  r0, r4
112  ldmfd  sp!, {r4, r9, pc}
113
114
115