-
Notifications
You must be signed in to change notification settings - Fork 551
/
BufferBlockCopyAsm.cs
44 lines (40 loc) · 1.81 KB
/
BufferBlockCopyAsm.cs
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
using XSharp.Assembler;
using IL2CPU.API;
using XSharp;
using CPUx86 = XSharp.Assembler.x86;
namespace Cosmos.Core_Asm
{
public class BufferBlockCopyAsm : AssemblerMethod
{
private const int SourceArrayDisplacement = 32;
private const int SourceIndexDisplacement = 24;
private const int DestinationArrayDisplacement = 20;
private const int DestinationIndexDisplacement = 12;
private const int CountDisplacement = 8;
/*public static void BlockCopy(
* Array src, [ebp + 32]
* int srcOffset, [ebp + 24]
* Array dst, [ebp + 20]
* int dstOffset, [ebp + 12]
* int count); [ebp + 8]
*/
public override void AssembleNew(Assembler aAssembler, object aMethodInfo)
{
XS.Comment("Source array");
XS.Set(XSRegisters.ESI, XSRegisters.EBP, sourceDisplacement: SourceArrayDisplacement);
XS.Add(XSRegisters.ESI, ObjectUtils.FieldDataOffset + 4);
XS.Comment("Source index");
XS.Set(XSRegisters.EAX, XSRegisters.EBP, sourceDisplacement: SourceIndexDisplacement);
XS.Add(XSRegisters.ESI, XSRegisters.EAX);
XS.Comment("Destination array");
XS.Set(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: DestinationArrayDisplacement);
XS.Add(XSRegisters.EDI, ObjectUtils.FieldDataOffset + 4);
XS.Comment("Destination index");
XS.Set(XSRegisters.EAX, XSRegisters.EBP, sourceDisplacement: DestinationIndexDisplacement);
XS.Add(XSRegisters.EDI, XSRegisters.EAX);
XS.Comment("Count");
XS.Set(XSRegisters.ECX, XSRegisters.EBP, sourceDisplacement: CountDisplacement);
new CPUx86.Movs { Size = 8, Prefixes = CPUx86.InstructionPrefixes.Repeat };
}
}
}