TianoCore EDK2 master
Loading...
Searching...
No Matches
MemoryIntrinsics.c
Go to the documentation of this file.
1
10#include <Base.h>
12#include <Library/BaseLib.h>
13
14typedef UINTN size_t;
15
16#if defined (__GNUC__) || defined (__clang__)
17#define GLOBAL_USED __attribute__((used))
18#else
19#define GLOBAL_USED
20#endif
21
22/* OpenSSL will use floating point support, and C compiler produces the _fltused
23 symbol by default. Simply define this symbol here to satisfy the linker. */
24int GLOBAL_USED _fltused = 1;
25
26/* Sets buffers to a specified character */
27void *
28memset (
29 void *dest,
30 int ch,
31 size_t count
32 )
33{
34 //
35 // NOTE: Here we use one base implementation for memset, instead of the direct
36 // optimized SetMem() wrapper. Because the IntrinsicLib has to be built
37 // without whole program optimization option, and there will be some
38 // potential register usage errors when calling other optimized codes.
39 //
40
41 //
42 // Declare the local variables that actually move the data elements as
43 // volatile to prevent the optimizer from replacing this function with
44 // the intrinsic memset()
45 //
46 volatile UINT8 *Pointer;
47
48 Pointer = (UINT8 *)dest;
49 while (count-- != 0) {
50 *(Pointer++) = (UINT8)ch;
51 }
52
53 return dest;
54}
55
56/* Compare bytes in two buffers. */
57int
58memcmp (
59 const void *buf1,
60 const void *buf2,
61 size_t count
62 )
63{
64 return (int)CompareMem (buf1, buf2, count);
65}
UINT64 UINTN
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)