1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
__inline
void * mymemcpy(void * dst, void const * src, size_t len)
{
00192A74 mov r12, sp
00192A78 stmdb sp!, {r0 - r2}
00192A7C stmdb sp!, {r12, lr}
00192A80 sub sp, sp, #0x28
char *pcDst = (char *)dst;
00192A84 ldr r3, dst
00192A88 str r3, pcDst
char const *pcSrc = (char const *)src;
00192A8C ldr r3, src
00192A90 str r3, pcSrc
int IntDst = reinterpret_cast<int>(dst);
00192A94 ldr r3, dst
00192A98 str r3, IntDst
int IntSrc = reinterpret_cast<int>(src);
00192A9C ldr r3, src
00192AA0 str r3, IntSrc
unsigned int iModulo;
// test for same alignment
if (((iModulo=(IntSrc & 0x03)) ^ (IntDst & 0x03))==0)
00192AA4 ldr r3, IntSrc
00192AA8 and r3, r3, #3
00192AAC str r3, iModulo
00192AB0 ldr r3, IntDst
00192AB4 and r2, r3, #3
00192AB8 ldr r3, iModulo
00192ABC teq r3, r2
00192AC0 bne |mymemcpy + 0x140 ( 192bb4h )|
{
// byte count needed to align 32 bit
unsigned int iAlignCount=(4-iModulo) & 0x03;
00192AC4 ldr r3, iModulo
00192AC8 rsb r3, r3, #4
00192ACC and r3, r3, #3
00192AD0 str r3, [sp, #0x14]
if (iAlignCount<=len)
00192AD4 ldr r2, [sp, #0x14]
00192AD8 ldr r3, len
00192ADC cmp r2, r3
00192AE0 bhi |mymemcpy + 0x140 ( 192bb4h )|
{
// head copy
len-=iAlignCount;
00192AE4 ldr r2, len
00192AE8 ldr r3, [sp, #0x14]
00192AEC sub r3, r2, r3
00192AF0 str r3, len
while (iAlignCount--)
00192AF4 ldr r3, [sp, #0x14]
00192AF8 cmp r3, #0
00192AFC ldr r3, [sp, #0x14]
00192B00 sub r3, r3, #1
00192B04 str r3, [sp, #0x14]
00192B08 beq |mymemcpy + 0xc4 ( 192b38h )|
*pcDst++ = *pcSrc++;
00192B0C ldr r3, pcSrc
00192B10 ldrsb r2, pcSrc
00192B14 ldr r3, pcDst
00192B18 strb r2, pcSrc
00192B1C ldr r3, pcDst
00192B20 add r3, r3, #1
00192B24 str r3, pcDst
00192B28 ldr r3, pcSrc
00192B2C add r3, r3, #1
00192B30 str r3, pcSrc
00192B34 b |mymemcpy + 0x80 ( 192af4h )|
//Each word will be 32 bits wide
unsigned int iCount = len >> 2;
00192B38 ldr r3, len
00192B3C mov r3, r3, lsr #2
00192B40 str r3, [sp, #0x20]
int *lpDst = (int *)pcDst;
00192B44 ldr r3, pcDst
00192B48 str r3, [sp, #0x1C]
int const *lpSrc = (int const *)pcSrc;
00192B4C ldr r3, pcSrc
00192B50 str r3, [sp, #0x18]
while (iCount--)
00192B54 ldr r3, [sp, #0x20]
00192B58 cmp r3, #0
00192B5C ldr r3, [sp, #0x20]
00192B60 sub r3, r3, #1
00192B64 str r3, [sp, #0x20]
00192B68 beq |mymemcpy + 0x124 ( 192b98h )|
*lpDst++ = *lpSrc++;
00192B6C ldr r3, [sp, #0x18]
00192B70 ldr r2, pcSrc
00192B74 ldr r3, [sp, #0x1C]
00192B78 str r2, pcSrc
00192B7C ldr r3, [sp, #0x1C]
00192B80 add r3, r3, #4
00192B84 str r3, [sp, #0x1C]
00192B88 ldr r3, [sp, #0x18]
00192B8C add r3, r3, #4
00192B90 str r3, [sp, #0x18]
00192B94 b |mymemcpy + 0xe0 ( 192b54h )|
// set pointers for last bytes
len&=0x03;
00192B98 ldr r3, len
00192B9C and r3, r3, #3
00192BA0 str r3, len
pcDst=(char *)lpDst;
00192BA4 ldr r3, [sp, #0x1C]
00192BA8 str r3, pcDst
pcSrc=(const char *)lpSrc;
00192BAC ldr r3, [sp, #0x18]
00192BB0 str r3, pcSrc
}
}
// tail copy
while (len--)
00192BB4 ldr r3, len
00192BB8 cmp r3, #0
00192BBC ldr r3, len
00192BC0 sub r3, r3, #1
00192BC4 str r3, len
00192BC8 beq |mymemcpy + 0x184 ( 192bf8h )|
*pcDst++ = *pcSrc++;
00192BCC ldr r3, pcSrc
00192BD0 ldrsb r2, pcSrc
00192BD4 ldr r3, pcDst
00192BD8 strb r2, pcSrc
00192BDC ldr r3, pcDst
00192BE0 add r3, r3, #1
00192BE4 str r3, pcDst
00192BE8 ldr r3, pcSrc
00192BEC add r3, r3, #1
00192BF0 str r3, pcSrc
00192BF4 b |mymemcpy + 0x140 ( 192bb4h )|
return (dst); |
Partager